Хеш SHA1 отличается между openssl и hashlib / pycrypto - PullRequest
7 голосов
/ 17 января 2012

Почему хеш от использования 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 ]

24 голосов
/ 17 января 2012

Вам не хватает конечной строки, которую echo добавит по умолчанию:

echo "Lorem ipsum" | openssl dgst -sha1 -hex
(stdin)= d0c05753484098c61e86f402a2875e68992b5ca3

С параметром -n он будет выводить только строку, которую вы ей дали, для ожидаемого результата:

echo -n "Lorem ipsum" | openssl dgst -sha1 -hex
(stdin)= 94912be8b3fb47d4161ea50e5948c6296af6ca05
6 голосов
/ 17 января 2012

echo помещает новую строку в конец строки

>>> sha("Lorem ipsum\n").hexdigest()
'd0c05753484098c61e86f402a2875e68992b5ca3'
1 голос
/ 17 января 2012

echo добавляет символ новой строки в строку. Опция -n подавляет перевод строки:

> echo -n "Lorem ipsum" | openssl dgst -sha1 -hex
94912be8b3fb47d4161ea50e5948c6296af6ca05
...