Base 64 Кодирование хэша SHA-1 в оболочке Bash

У меня есть команда Python, которая генерирует URL-безопасную кодировку base-64 хэша строки SHA-1:

>>> import base64
>>> import sha
>>> base64.urlsafe_b64encode((sha.new("abc").digest()))
'qZk-NkcGgWq6PiVxeFDCbJzQ2J0='

Я хочу сделать то же самое в оболочке bash, но у меня возникают проблемы:

me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' 
a9993e364706816aba3e25717850c26c9cd0d89d
me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' | base64
YTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZAo=

Я подозреваю, что это из-за того, как распечатывается sha1sum (в шестнадцатеричном формате). Я думаю, что base64 читает 40 байт, но на самом деле он должен читать только 20. Я пытался передать его через iconv, но безуспешно:

me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' 
a9993e364706816aba3e25717850c26c9cd0d89d
me:~$ echo -n "abc" | sha1sum | sed 's/ .*//' | base64
YTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZAo=

Что я должен делать здесь, чтобы получить результат, который я ожидаю?

Заранее спасибо за помощь!


person Thomas Kelley    schedule 14.09.2012    source источник
comment
Не проще ли было бы распечатать SHA1 в шестнадцатеричном формате из Python? Это почти универсальное удобочитаемое представление для этого конкретного типа данных.   -  person tripleee    schedule 15.09.2012


Ответы (1)


дайджест() — это не то же самое, что шестнадцатеричный дайджест().

base64.urlsafe_b64encode((sha.new("abc").hexdigest()))
'YTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZA=='

Строка документации для дайджеста:

Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:<built-in method digest of _hashlib.HASH object at 0x1c88940>
Namespace:  Interactive
Docstring:  Return the digest value as a **string of binary data**.

ИЗМЕНИТЬ: Попробуйте:

echo -n "abc"| openssl sha1 -binary | base64
qZk+NkcGgWq6PiVxeFDCbJzQ2J0=
person Anton Bessonov    schedule 14.09.2012
comment
Да, я понимаю. Я пытаюсь заставить вывод команды Bash соответствовать выводу Python; А не наоборот. Метод, используемый в моей команде Python, находится вне моего контроля. - person Thomas Kelley; 14.09.2012
comment
Только что увидел редактирование. Идеальный! Это именно то, что я искал. Спасибо! - person Thomas Kelley; 14.09.2012
comment
Это потому, что я использовал urlsafe_b64encode() вместо просто b64encode() в команде Python. Все, что нужно сделать, это заменить символы «+» на «-», а символы «/» на «_». - person Thomas Kelley; 14.09.2012