Python 標準ライブラリ hashlib ハッシュアルゴリズム
Publish date: 2021-08-11
ライブラリhashlibを使うと種々のアルゴリズムでハッシュの計算を行えます。
ダイジェスト値計算
ダイジェスト値の計算はsha256()
やmd5()
等のアルゴリズムを示すコンストラクタにデータを指定し、
digest()
、hexdigest()
を呼び出す事で行える。
digest()
はバイト列、hexdigest()
は16進数文字列を返却する。
import hashlib
hashlib.sha256(b'test').digest()
# => b'\x9f\x86\xd0\x81\x88L}e\x9a/\xea\xa0\xc5Z\xd0\x15\xa3\xbfO\x1b+\x0b\x82,\xd1]l\x15\xb0\xf0\n\x08'
hashlib.sha256(b'test').hexdigest()
# => '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
アルゴリズムの指定はhashlib.new(name, [data, ]*, usedforsecurity=True)
でnameにアルゴリズムの名称を渡すことでも行える。
hashlib.new('sha256',b'test').digest()
# => b'\x9f\x86\xd0\x81\x88L}e\x9a/\xea\xa0\xc5Z\xd0\x15\xa3\xbfO\x1b+\x0b\x82,\xd1]l\x15\xb0\xf0\n\x08'
hashlib.new('sha256',b'test').hexdigest()
# => '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
データはupdate(data)
で設定できる。
sha = hashlib.sha256()
sha.update(b'test')
sha.digest() # => b'\x9f\x86\xd0\x81\x88L}e\x9a/\xea\xa0\xc5Z\xd0\x15\xa3\xbfO\x1b+\x0b\x82,\xd1]l\x15\xb0\xf0\n\x08'
sha.hexdigest() #=> '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
updateはバイト列を分けて指定することもできる。
sha = hashlib.new('sha256')
sha.update(b'te')
sha.update(b'st')
sha.digest() # => b'\x9f\x86\xd0\x81\x88L}e\x9a/\xea\xa0\xc5Z\xd0\x15\xa3\xbfO\x1b+\x0b\x82,\xd1]l\x15\xb0\xf0\n\x08'
sha.hexdigest() #=> '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
ハッシュのアルゴリズム
hashlib.algorithms_guaranteed
すべてのプラットフォームでサポートされるハッシュのアルゴリズム名のリスト。
hashlib.algorithms_guaranteed
{'blake2b',
'blake2s',
'md4',
'md5',
'md5-sha1',
…
'whirlpool'}
hashlib.algorithms_available
実行中の環境で利用可能なハッシュのアルゴリズム名のリスト。
hashlib.algorithms_available
{'blake2b',
'blake2s',
'md5',
…
'shake_256'}
ハッシュオブジェクトのプロパティ、関数
algorithms = [hashlib.new(x) for x in hashlib.algorithms_available]
for algorithm in algorithms:
algorithm.update(b'test')
print(algorithm.name) # ハッシュの正規名
print(algorithm.digest_size) # 生成されたハッシュのバイト数
print(algorithm.block_size) # ハッシュアルゴリズムのブロックのバイト数
if algorithm.name.startswith('shake'):
print(algorithm.digest(10)) # ダイジェスト値
print(algorithm.hexdigest(10)) # 16進数文字列
else:
print(algorithm.digest()) # ダイジェスト値
print(algorithm.hexdigest()) # 16進数文字列
shake_128()
、shake_256()
のダイジェスト値は長さの指定をして取得する。