pythonモジュールのhashlib

4612 ワード

hashlibモジュールは、FIPSで定義されたSHA 1、SHA 224、SHA 256、SHA 384、SHA 512、およびRFC 1321で定義されたMD 5を含む、様々なセキュリティハッシュおよび情報要約アルゴリズムの汎用インタフェースを実現する.
注意点:1.adler 32およびcrc 32ハッシュはzlibモジュールによって提供する.いくつかのアルゴリズムにはハッシュ衝突の弱点が知られている
ハッシュアルゴリズム
各hashアルゴリズムには同名のコンストラクション関数があり、同じインタフェースを持つhashオブジェクトを返します.
sha 1()、sha 224()、sha 256()、sha 384()、sha 512()、blake 2 b()、blake 2 s()の構造関数は、hashlibモジュールで常に使用可能である.md 5()は通常使用できますが、いくつかの珍しいpythonバージョン(“FIPS compliant” build of Python)では例外です.使用するプラットフォーム上でpythonが使用するOpenSSLに応じて、hashlibはいくつかの追加のアルゴリズムをサポートし、ほとんどのプラットフォームではsha 3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256()はすべて使用可能です.
>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'

またはよりシンプルな方法:
>>> hashlib.sha256(b"Nobody inspects the spammish repetition").digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'

hashlib.new(name[, data])
汎用コンストラクション関数で、nameパラメータは使用するhashアルゴリズムの名前を表し、上述したすべてのhashアルゴリズムおよびOpenSSLライブラリがサポートする他のアルゴリズムであってもよい.アルゴリズム名を使用して関数を構築するのはnew()を使用するより速い
>>> h = hashlib.new("sha256", b"Nobody inspects the spammish repetition")
>>> h.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'

hashlib.algorithms_guaranteed
すべてのプラットフォームのhashlibモジュールでサポートされているhashアルゴリズムの名前の集合.md 5もこの集合中である(Note that ‘md5’ is in this list despite some upstream vendors offering an odd “FIPS compliant” Python build that excludes it.).
hashlib.algorithms_available
現在実行されているpython解釈器でサポートされているhashアルゴリズムの名前セットは、new()コンストラクション関数で使用しても正しく認識されます.同じアルゴリズムは、異なる名前で複数回表示される場合があります.hashlib.algorithms_guaranteedの結果セットは常にhashlib.algorithms_AVailable結果セットのサブセット
hash.digest_size
hashオブジェクトのバイト長
hash.block_size
hashオブジェクトの内部ブロックサイズ
hash.name
hashオブジェクトの名前
hash.update(data)
クラスバイトパラメータ(通常bytes)を渡してhashオブジェクトを更新します.繰り返し呼び出しupdate()は、単一のパッチ呼び出しに等しい:m.update(a);m.update(b)はm.update(a+b)と同等である
python 3から1から、マルチスレッドのパフォーマンスを向上させるためにOpenSSLでサポートされているhashアルゴリズムを使用し、処理データ量が2047バイトより大きいupdate(または作成)操作が発生すると、pythonグローバル解釈ロックが解放され、他のスレッドが実行できるようになります.
hash.digest()
このメソッド呼び出しを終了するとupdate()が受信したデータの要約は、0~255のすべてのバイトを含むバイトオブジェクトです.
hash.hexdigest()
digest()と同様ですが、16進数の文字列オブジェクトの2倍の長さでサマリー値を返します.
hash.copy()
hashオブジェクトのクローンを返します
SHAKEアルゴリズムの可変長要約The shake_128() and shake_256() algorithms provide variable length digests with length_in_bits//2 up to 128 or 256 bits of security
shake.digest(length)
同hashdigest()
shake.hexdigest(length)
同hashhexdigest()
キーのエクスポート
鍵のエクスポートと拡張アルゴリズムは、セキュリティパスワードのハッシュのために設計されています.sha 1(password)のような簡単なアルゴリズムは暴力的な解読を効果的に防ぐことができず,良い暗号ハッシュ関数は調整可能で,時間がかかり,塩を含む必要がある.
hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
pbkdf2_hmac()は、偽ランダム関数としてHMACを用いたPKCS 5充填pbkdf 2アルゴリズムを提供する.
hash_nameは、HMACのハッシュ要約アルゴリズムの名前、例えば「sha 1」または「sha 256」を表す.
passwordとsaltはクラスバイトオブジェクトであり、passwordの長さは合理的な範囲に制限され、saltの長さは16バイト以上であり、ソースが適切であるべきである.
iterationsは反復回数を表し,hashアルゴリズムおよび機械計算能力設定に基づいている.2013年現在、sha 256アルゴリズムは最低10万回の反復を提案している.
dklenは、エクスポートキーの長さを表す.デフォルトはNone、hash_を使用nameアルゴリズムで計算されたhashオブジェクトのdigest_Size属性長
>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

Note: A fast implementation of pbkdf2_hmac is available with OpenSSL. The Python implementation uses an inline version of hmac. It is about three times slower and doesn’t release the GIL.
hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)
The function provides scrypt password-based key derivation function as defined in RFC 7914.
passwordとsaltはクラスバイトオブジェクトであり、passwordの長さは合理的な範囲に制限され、saltの長さは16バイト以上であり、ソースが適切であるべきである.
n is the CPU/Memory cost factor, r the block size, p parallelization factor and maxmem limits memory (OpenSSL 1.1.0 defaults to 32 MiB). dklen is the length of the derived key.
BLAKE2
補足する必要があります...本当に編集できないので、暗号化アルゴリズムに関する知識が不足しています.