'a'のSHA256は?
シェルからコマンドを使って...
$ echo a | sha256sum
87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7 -
一旦、ファイルに保存して
$ echo a > a.txt
$ sha256sum a.txt
87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7 a.txt
結果は同じ。
次は、最近始めたPythonで...
>>> import hashlib
>>> hashlib.sha256(b"a").hexdigest()
'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb'
結果が異なる。
なぜだ...それはシェルで試した例ではsha256sum
の入力(= echo
の出力)に改行コード(LF)が付いていたからでした。
ちょっと調べてみると、echo
の出力に改行コードをつけないためには-n
オプション指定するようなので...
$ echo -n a | sha256sum
ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb -
Pythonで求めた結果と一致した。
というわけで、'a'のSHA256はca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
が正解。
'a'+LFのSHA256
echo
の出力に改行コード(LF)が付いているのに気づいたのは、何気なくファイルをダンプしたとき。
$ xxd a.txt
00000000: 610a a.
'a'(=0x61)の後ろにLF(=0x0a)がくっついてる。
PythonでLFを含めたバイト列のハッシュ値を取得すると...
>>> hashlib.sha256(b"\x61\x0a").hexdigest()
'87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7'
シェルからコマンドを使って取得した値と一致した。
ということで、'a'+LFのSHA256が87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7
。
まとめ
シェルで文字列のハッシュ値を求める時にecho
を使うのであれば改行コードを付けないように-n
オプションを指定する必要がある。改行コードを付けてしまうと、当然、(本来求めたいはずの)改行コードを付けない文字列のハッシュ値とは全く異なる値になってしまう。