1

文字列のSHA-1ハッシュのURLセーフなbase-64エンコーディングを生成するPythonコマンドがあります。

>>> 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が(16進形式で)出力される方法が原因であると思われます。base64は40バイトを読み取っていると思いますが、実際には20バイトしか読み取っていないはずです。iconvを介してパイプ処理を試みましたが、成功しませんでした。

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

期待する出力を得るために、ここで何をすべきですか?

助けてくれてありがとう!

4

1 に答える 1

8

digest()はhexdigest()と同じではありません

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

ダイジェストのDocstring:

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=
于 2012-09-14T19:36:21.507 に答える