14.1. hashlib —セキュアハッシュとメッセージダイジェスト—Pythonドキュメント
14.1。 hashlib —安全なハッシュとメッセージダイジェスト
バージョン2.5の新機能。
ソースコード: :source: `Lib / hashlib.py`
このモジュールは、多くの異なるセキュアハッシュおよびメッセージダイジェストアルゴリズムへの共通インターフェースを実装します。 FIPSセキュアハッシュアルゴリズムSHA1、SHA224、SHA256、SHA384、SHA512(FIPS 180-2で定義)、およびRSAのMD5アルゴリズム(インターネット RFC 1321 で定義)が含まれています。 。 セキュアハッシュとメッセージダイジェストという用語は交換可能です。 古いアルゴリズムはメッセージダイジェストと呼ばれていました。 現代の用語はセキュアハッシュです。
警告
一部のアルゴリズムには既知のハッシュ衝突の弱点があります。最後の「関連項目」セクションを参照してください。
hash のタイプごとに名前が付けられたコンストラクターメソッドが1つあります。 すべてが同じ単純なインターフェースを持つハッシュオブジェクトを返します。 例:sha1()
を使用して、SHA1ハッシュオブジェクトを作成します。 update()
メソッドを使用して、このオブジェクトに任意の文字列をフィードできるようになりました。 digest()
またはhexdigest()
メソッドを使用して、これまでにフィードされた文字列の連結のダイジェストをいつでも要求できます。
このモジュールに常に存在するハッシュアルゴリズムのコンストラクターは、 md5()、sha1()
、sha224()
、sha256()
、sha384()
、およびsha512()
。 Pythonがプラットフォームで使用するOpenSSLライブラリによっては、追加のアルゴリズムも利用できる場合があります。
たとえば、文字列'Nobody inspects the spammish repetition'
のダイジェストを取得するには、次のようにします。
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64
より凝縮された:
>>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
目的のアルゴリズムの文字列名を最初のパラメーターとして受け取る汎用の new()コンストラクターも存在し、上記のハッシュやOpenSSLライブラリが提供するその他のアルゴリズムにアクセスできるようにします。 名前付きコンストラクターは new()よりもはるかに高速であるため、優先する必要があります。
OpenSSLが提供するアルゴリズムで new()を使用する:
>>> h = hashlib.new('ripemd160')
>>> h.update("Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'
このモジュールは、次の定数属性を提供します。
- hashlib.algorithms
このモジュールでサポートされることが保証されているハッシュアルゴリズムの名前を提供するタプル。
バージョン2.7の新機能。
- hashlib.algorithms_guaranteed
すべてのプラットフォームでこのモジュールによってサポートされることが保証されているハッシュアルゴリズムの名前を含むセット。
バージョン2.7.9の新機能。
- hashlib.algorithms_available
実行中のPythonインタープリターで使用可能なハッシュアルゴリズムの名前を含むセット。 これらの名前は、 new()に渡されたときに認識されます。 Algorithms_guaranteed は常にサブセットになります。 同じアルゴリズムが、このセットに異なる名前で複数回表示される場合があります(OpenSSLのおかげです)。
バージョン2.7.9の新機能。
次の値は、コンストラクターによって返されるハッシュオブジェクトの定数属性として提供されます。
- hash.digest_size
- 結果のハッシュのサイズ(バイト単位)。
- hash.block_size
- ハッシュアルゴリズムの内部ブロックサイズ(バイト単位)。
ハッシュオブジェクトには次のメソッドがあります。
- hash.update(arg)
文字列 arg でハッシュオブジェクトを更新します。 繰り返される呼び出しは、すべての引数を連結した単一の呼び出しと同等です。
m.update(a); m.update(b)
はm.update(a+b)
と同等です。バージョン2.7で変更: Python GILがリリースされ、OpenSSLが提供するハッシュアルゴリズムを使用しているときに2048バイトを超えるデータのハッシュ更新が行われているときに他のスレッドを実行できるようになりました。
- hash.digest()
- これまでに update()メソッドに渡された文字列のダイジェストを返します。 これは digest_size バイトの文字列であり、nullバイトを含む非ASCII文字を含めることができます。
- hash.hexdigest()
- digest()と同様ですが、ダイジェストが16進数のみを含む2倍の長さの文字列として返される点が異なります。 これは、電子メールまたはその他の非バイナリ環境で安全に値を交換するために使用できます。
- hash.copy()
- ハッシュオブジェクトのコピー(「クローン」)を返します。 これを使用して、共通の初期サブ文字列を共有する文字列のダイジェストを効率的に計算できます。
14.1.1。 鍵導出
鍵導出および鍵ストレッチアルゴリズムは、安全なパスワードハッシュのために設計されています。 sha1(password)
などの単純なアルゴリズムは、ブルートフォース攻撃に対して耐性がありません。 優れたパスワードハッシュ関数は、調整可能で低速であり、 salt を含む必要があります。
- hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None)
この関数は、PKCS#5パスワードベースの鍵導出関数2を提供します。 疑似乱数関数としてHMACを使用します。
文字列 name は、HMACのハッシュダイジェストアルゴリズムの目的の名前です。 「sha1」または「sha256」。 password および salt は、バイトのバッファーとして解釈されます。 アプリケーションとライブラリは、パスワードを適切な値に制限する必要があります(例: 1024). salt は、適切なソースから約16バイト以上である必要があります。 os.urandom()。
ラウンド数は、ハッシュアルゴリズムと計算能力に基づいて選択する必要があります。 2013年の時点で、少なくとも100,000ラウンドのSHA-256が推奨されています。
dklen は、派生キーの長さです。 dklen が
None
の場合、ハッシュアルゴリズム name のダイジェストサイズが使用されます。 SHA-512の場合は64。>>> import hashlib, binascii >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000) >>> binascii.hexlify(dk) b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'
バージョン2.7.8の新機能。
ノート
pbkdf2_hmac の高速実装は、OpenSSLで利用できます。 Pythonの実装では、インラインバージョンの hmac を使用します。 約3倍遅く、GILを解放しません。
も参照してください
- モジュール hmac
- ハッシュを使用してメッセージ認証コードを生成するモジュール。
- モジュール base64
- 非バイナリ環境のバイナリハッシュをエンコードする別の方法。
- http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
- Secure HashAlgorithmsに関するFIPS180-2の出版物。
- https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms
- どのアルゴリズムに既知の問題があり、それがそれらの使用に関して何を意味するかについての情報を含むウィキペディアの記事。