2021-08-12に投稿

Python 標準ライブラリ hashlib ハッシュアルゴリズム

ライブラリ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()のダイジェスト値は長さの指定をして取得する。

参考

Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント