SHA1 哈希在 openssl 和 hashlib/pycrypto 中不同
为什么用openssl生成的哈希值和我在python中得到的哈希值不一样呢?
$ echo "Lorem ipsum" | openssl dgst -sha1 -hex
(stdin)= d0c05753484098c61e86f402a2875e68992b5ca3
$ python
>>> from hashlib import sha1
>>> sha("Lorem ipsum").hexdigest()
'94912be8b3fb47d4161ea50e5948c6296af6ca05'
>>> from Crypto.Hash import SHA
>>> SHA.new("Lorem ipsum").hexdigest()
'94912be8b3fb47d4161ea50e5948c6296af6ca05'
这些字符串不一样吗?我是不是漏掉了什么明显的东西?
编辑:谢谢你指出这个问题。我是从一个文件中读取保存的消息,这个文件也有同样烦人的换行符问题。
$ cat message | openssl dgst -sha1 -hex
'keep whacking your head mate, it wont be the same'
$ echo -n $(cat message) | openssl dgst -sha1 -hex
'ok, you got me, for now'
3 个回答
1
echo
命令会在字符串的末尾加上一个换行符,也就是让输出的内容换到下一行。而选项 -n 可以让你不加这个换行符,也就是说输出的内容会紧接着在同一行显示:
> echo -n "Lorem ipsum" | openssl dgst -sha1 -hex
94912be8b3fb47d4161ea50e5948c6296af6ca05
6
echo在字符串的末尾加了一个换行符。
>>> sha("Lorem ipsum\n").hexdigest()
'd0c05753484098c61e86f402a2875e68992b5ca3'
25
你缺少了一个换行符,默认情况下,echo
会自动加上这个换行符:
echo "Lorem ipsum" | openssl dgst -sha1 -hex
(stdin)= d0c05753484098c61e86f402a2875e68992b5ca3
如果加上 -n
参数,它就只会输出你给它的字符串,不会再加换行符,这样就能得到你想要的结果:
echo -n "Lorem ipsum" | openssl dgst -sha1 -hex
(stdin)= 94912be8b3fb47d4161ea50e5948c6296af6ca05