LoginSignup
1
0

More than 5 years have passed since last update.

echoの出力には改行が含まれ、当然、ハッシュ値も変わる

Posted at

'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オプションを指定する必要がある。改行コードを付けてしまうと、当然、(本来求めたいはずの)改行コードを付けない文字列のハッシュ値とは全く異なる値になってしまう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0