15.1. hashlib —セキュアハッシュとメッセージダイジェスト—Pythonドキュメント
15.1。 hashlib —安全なハッシュとメッセージダイジェスト
ソースコード: :source: `Lib / hashlib.py`
このモジュールは、多くの異なるセキュアハッシュおよびメッセージダイジェストアルゴリズムへの共通インターフェースを実装します。 FIPSセキュアハッシュアルゴリズムSHA1、SHA224、SHA256、SHA384、SHA512(FIPS 180-2で定義)、およびRSAのMD5アルゴリズム(インターネット RFC 1321 で定義)が含まれています。 。 「セキュアハッシュ」と「メッセージダイジェスト」という用語は交換可能です。 古いアルゴリズムはメッセージダイジェストと呼ばれていました。 現代の用語はセキュアハッシュです。
警告
一部のアルゴリズムには既知のハッシュ衝突の弱点があります。最後の「関連項目」セクションを参照してください。
15.1.1。 ハッシュアルゴリズム
hash のタイプごとに名前が付けられたコンストラクターメソッドが1つあります。 すべてが同じ単純なインターフェースを持つハッシュオブジェクトを返します。 例:sha256()
を使用して、SHA-256ハッシュオブジェクトを作成します。 update()
メソッドを使用して、このオブジェクトにバイトのようなオブジェクト(通常はバイト)をフィードできるようになりました。 digest()
またはhexdigest()
メソッドを使用して、これまでにフィードされたデータの連結のダイジェストをいつでも要求できます。
ノート
ハッシュは文字ではなくバイトで機能するため、文字列オブジェクトをupdate()
にフィードすることはサポートされていません。
このモジュールに常に存在するハッシュアルゴリズムのコンストラクターは、sha1()
、sha224()
、sha256()
、sha384()
、sha512()
、です。 blake2b()、および blake2s()。 md5()
も通常は利用可能ですが、Pythonのまれな「FIPS準拠」ビルドを使用している場合は欠落している可能性があります。 Pythonがプラットフォームで使用するOpenSSLライブラリによっては、追加のアルゴリズムも利用できる場合があります。 ほとんどのプラットフォームでは、sha3_224()
、sha3_256()
、sha3_384()
、sha3_512()
、shake_128()
、shake_256()
も利用できます。
バージョン3.6の新機能: SHA3(Keccak)およびSHAKEコンストラクターsha3_224()
、sha3_256()
、sha3_384()
、sha3_512()
、 [ X114X]、shake_256()
。
たとえば、バイト文字列b'Nobody inspects the spammish repetition'
のダイジェストを取得するには、次のようにします。
>>> 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'
>>> m.digest_size
32
>>> m.block_size
64
より凝縮された:
>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
- hashlib.new(name[, data])
- 目的のアルゴリズムの文字列 name を最初のパラメーターとして受け取るジェネリックコンストラクターです。 また、上記のハッシュや、OpenSSLライブラリが提供するその他のアルゴリズムへのアクセスを許可するためにも存在します。 名前付きコンストラクターは new()よりもはるかに高速であるため、優先する必要があります。
OpenSSLが提供するアルゴリズムで new()を使用する:
>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'
Hashlibは、次の定数属性を提供します。
- hashlib.algorithms_guaranteed
すべてのプラットフォームでこのモジュールによってサポートされることが保証されているハッシュアルゴリズムの名前を含むセット。 'md5'は、それを除外する奇妙な「FIPS準拠」のPythonビルドを提供している一部のアップストリームベンダーにもかかわらず、このリストに含まれていることに注意してください。
バージョン3.2の新機能。
- hashlib.algorithms_available
実行中のPythonインタープリターで使用可能なハッシュアルゴリズムの名前を含むセット。 これらの名前は、 new()に渡されたときに認識されます。 Algorithms_guaranteed は常にサブセットになります。 同じアルゴリズムが、このセットに異なる名前で複数回表示される場合があります(OpenSSLのおかげです)。
バージョン3.2の新機能。
次の値は、コンストラクターによって返されるハッシュオブジェクトの定数属性として提供されます。
- hash.digest_size
- 結果のハッシュのサイズ(バイト単位)。
- hash.block_size
- ハッシュアルゴリズムの内部ブロックサイズ(バイト単位)。
ハッシュオブジェクトには次の属性があります。
- hash.name
このハッシュの正規名。常に小文字であり、このタイプの別のハッシュを作成するための new()のパラメーターとして常に適しています。
バージョン3.4で変更: name属性はCPythonの開始以来存在していましたが、Python 3.4が正式に指定されるまでは存在しなかったため、一部のプラットフォームでは存在しない可能性があります。
ハッシュオブジェクトには次のメソッドがあります。
- hash.update(data)
バイトのようなオブジェクトでハッシュオブジェクトを更新します。 繰り返される呼び出しは、すべての引数を連結した単一の呼び出しと同等です。
m.update(a); m.update(b)
はm.update(a+b)
と同等です。バージョン3.1で変更: Python GILがリリースされ、OpenSSLが提供するハッシュアルゴリズムを使用しているときに、2047バイトを超えるデータのハッシュ更新が行われているときに他のスレッドを実行できるようになりました。
- hash.digest()
- これまでに update()メソッドに渡されたデータのダイジェストを返します。 これはサイズ digest_size のバイトオブジェクトであり、0から255までの全範囲のバイトを含むことができます。
- hash.hexdigest()
- digest()と同様ですが、ダイジェストが16進数のみを含む2倍の長さの文字列オブジェクトとして返される点が異なります。 これは、電子メールまたはその他の非バイナリ環境で安全に値を交換するために使用できます。
- hash.copy()
- ハッシュオブジェクトのコピー(「クローン」)を返します。 これは、共通の初期サブストリングを共有するデータのダイジェストを効率的に計算するために使用できます。
15.1.2。 可変長ダイジェストをシェイクする
shake_128()
およびshake_256()
アルゴリズムは、最大128または256ビットのセキュリティのlength_in_bits // 2を備えた可変長ダイジェストを提供します。 そのため、それらのダイジェストメソッドには長さが必要です。 最大長はSHAKEアルゴリズムによって制限されません。
- shake.digest(length)
- これまでに
update()
メソッドに渡されたデータのダイジェストを返します。 これは、サイズ長さのバイトオブジェクトであり、0から255までの全範囲のバイトを含むことができます。
- shake.hexdigest(length)
- digest()と同様ですが、ダイジェストが16進数のみを含む2倍の長さの文字列オブジェクトとして返される点が異なります。 これは、電子メールまたはその他の非バイナリ環境で安全に値を交換するために使用できます。
15.1.3。 鍵導出
鍵導出および鍵ストレッチアルゴリズムは、安全なパスワードハッシュのために設計されています。 sha1(password)
などの単純なアルゴリズムは、ブルートフォース攻撃に対して耐性がありません。 優れたパスワードハッシュ関数は、調整可能で低速であり、 salt を含む必要があります。
- hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
この関数は、PKCS#5パスワードベースの鍵導出関数2を提供します。 疑似乱数関数としてHMACを使用します。
文字列 hash_name は、HMACのハッシュダイジェストアルゴリズムの目的の名前です。 「sha1」または「sha256」。 password および salt は、バイトのバッファーとして解釈されます。 アプリケーションとライブラリは、パスワードを適切な長さに制限する必要があります(例: 1024). salt は、適切なソースから約16バイト以上である必要があります。 os.urandom()。
反復回数は、ハッシュアルゴリズムと計算能力に基づいて選択する必要があります。 2013年の時点で、SHA-256の少なくとも100,000回の反復が推奨されています。
dklen は、派生キーの長さです。 dklen が
None
の場合、ハッシュアルゴリズム hash_name のダイジェストサイズが使用されます。 SHA-512の場合は64。>>> import hashlib, binascii >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000) >>> binascii.hexlify(dk) b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'
バージョン3.4の新機能。
ノート
pbkdf2_hmac の高速実装は、OpenSSLで利用できます。 Pythonの実装では、インラインバージョンの hmac を使用します。 約3倍遅く、GILを解放しません。
- hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)
この関数は、 RFC 7914 で定義されているscryptパスワードベースの鍵導出関数を提供します。
password および salt は、バイトのようなオブジェクトである必要があります。 アプリケーションとライブラリは、パスワードを適切な長さに制限する必要があります(例: 1024). salt は、適切なソースから約16バイト以上である必要があります。 os.urandom()。
n はCPU /メモリのコスト係数、 r はブロックサイズ、 p の並列化係数、 maxmem はメモリを制限します(OpenSSL 1.1.0デフォルトは32MBです)。 dklen は、派生キーの長さです。
可用性:OpenSSL 1.1+
バージョン3.6の新機能。
15.1.4。 BLAKE2
BLAKE2 は、 RFC 7693 で定義されている暗号化ハッシュ関数であり、次の2つの種類があります。
- BLAKE2b 、64ビットプラットフォーム用に最適化され、1〜64バイトの任意のサイズのダイジェストを生成します。
- BLAKE2s は、8〜32ビットプラットフォーム用に最適化されており、1〜32バイトの任意のサイズのダイジェストを生成します。
BLAKE2は、キーモード( HMAC のより高速で簡単な置換)、ソルトハッシュ、パーソナライズ、およびツリーハッシュ[ X161X]。
このモジュールのハッシュオブジェクトは、標準ライブラリの hashlib オブジェクトのAPIに従います。
15.1.4.1。 ハッシュオブジェクトの作成
新しいハッシュオブジェクトは、コンストラクター関数を呼び出すことによって作成されます。
- hashlib.blake2b(data=b, *, digest_size=64, key=b, salt=b, person=b, fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False)
- hashlib.blake2s(data=b, *, digest_size=32, key=b, salt=b, person=b, fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False)
これらの関数は、BLAKE2bまたはBLAKE2sを計算するための対応するハッシュオブジェクトを返します。 オプションで、次の一般的なパラメータを取ります。
- data :ハッシュするデータの初期チャンク。バイトのようなオブジェクトである必要があります。 位置引数としてのみ渡すことができます。
- digest_size :出力ダイジェストのサイズ(バイト単位)。
- key :キー付きハッシュ用のキー(BLAKE2bの場合は最大64バイト、BLAKE2sの場合は最大32バイト)。
- salt :ランダムハッシュ用のsalt(BLAKE2bの場合は最大16バイト、BLAKE2sの場合は最大8バイト)。
- person :パーソナライズ文字列(BLAKE2bの場合は最大16バイト、BLAKE2sの場合は最大8バイト)。
次の表に、一般的なパラメーターの制限(バイト単位)を示します。
ハッシュ | ダイジェストサイズ | len(key) | len(塩) | len(人) |
---|---|---|---|---|
BLAKE2b | 64 | 64 | 16 | 16 |
BLAKE2s | 32 | 32 | 8 | 8 |
ノート
BLAKE2仕様では、ソルトおよびパーソナライズパラメータの定数長が定義されていますが、便宜上、この実装では、指定された長さまでの任意のサイズのバイト文字列を受け入れます。 パラメータの長さが指定より短い場合、ゼロが埋め込まれるため、たとえば、b'salt'
とb'salt\x00'
は同じ値になります。 (これはキーには当てはまりません。)
これらのサイズは、以下で説明するモジュール定数として利用できます。
コンストラクター関数は、次のツリーハッシュパラメーターも受け入れます。
- ファンアウト:ファンアウト(0〜255、無制限の場合は0、シーケンシャルモードの場合は1)。
- depth :ツリーの最大深度(1〜255、無制限の場合は255、シーケンシャルモードの場合は1)。
- leaf_size :リーフの最大バイト長(無制限またはシーケンシャルモードの場合は0〜2 ** 32-1、0)。
- node_offset :ノードオフセット(BLAKE2bの場合は0〜2 ** 64-1、BLAKE2sの場合は0〜2 ** 48-1、最初、左端、リーフ、またはシーケンシャルモードの場合は0)。
- node_depth :ノードの深さ(0から255、リーフの場合は0、またはシーケンシャルモードの場合)。
- inner_size :内部ダイジェストサイズ(BLAKE2bの場合は0〜64、BLAKE2sの場合は0〜32、シーケンシャルモードの場合は0)。
- last_node :処理されたノードが最後のノードであるかどうかを示すブール値(シーケンシャルモードの場合は False )。
ツリーハッシュの包括的なレビューについては、 BLAKE2仕様のセクション2.10を参照してください。
15.1.4.2。 定数
- blake2b.SALT_SIZE
- blake2s.SALT_SIZE
ソルトの長さ(コンストラクターが受け入れる最大の長さ)。
- blake2b.PERSON_SIZE
- blake2s.PERSON_SIZE
パーソナライズ文字列の長さ(コンストラクターが受け入れる最大長)。
- blake2b.MAX_KEY_SIZE
- blake2s.MAX_KEY_SIZE
キーの最大サイズ。
- blake2b.MAX_DIGEST_SIZE
- blake2s.MAX_DIGEST_SIZE
ハッシュ関数が出力できる最大ダイジェストサイズ。
15.1.4.3。 例
15.1.4.3.1。 単純なハッシュ
一部のデータのハッシュを計算するには、最初に適切なコンストラクター関数( blake2b()または blake2s())を呼び出してハッシュオブジェクトを作成し、次にを呼び出してデータで更新する必要があります。オブジェクトのupdate()
を実行し、最後に、digest()
(または、16進エンコードされた文字列の場合はhexdigest()
)を呼び出して、オブジェクトからダイジェストを取得します。
>>> from hashlib import blake2b
>>> h = blake2b()
>>> h.update(b'Hello world')
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
ショートカットとして、データの最初のチャンクを渡して、位置引数としてコンストラクターに直接更新できます。
>>> from hashlib import blake2b
>>> blake2b(b'Hello world').hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
hash.update()は、ハッシュを繰り返し更新するために必要な回数だけ呼び出すことができます。
>>> from hashlib import blake2b
>>> items = [b'Hello', b' ', b'world']
>>> h = blake2b()
>>> for item in items:
... h.update(item)
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'
15.1.4.3.2。 異なるダイジェストサイズを使用する
BLAKE2には、BLAKE2bの場合は最大64バイト、BLAKE2の場合は最大32バイトのダイジェストの構成可能なサイズがあります。 たとえば、出力のサイズを変更せずにSHA-1をBLAKE2bに置き換えるには、BLAKE2bに20バイトのダイジェストを生成するように指示できます。
>>> from hashlib import blake2b
>>> h = blake2b(digest_size=20)
>>> h.update(b'Replacing SHA1 with the more secure function')
>>> h.hexdigest()
'd24f26cf8de66472d58d4e1b1774b4c9158b1f4c'
>>> h.digest_size
20
>>> len(h.digest())
20
ダイジェストサイズが異なるハッシュオブジェクトの出力は完全に異なります(短いハッシュは長いハッシュのではなくプレフィックスです)。 BLAKE2bとBLAKE2sは、出力長が同じであっても、異なる出力を生成します。
>>> from hashlib import blake2b, blake2s
>>> blake2b(digest_size=10).hexdigest()
'6fa1d8fcfd719046d762'
>>> blake2b(digest_size=11).hexdigest()
'eb6ec15daf9546254f0809'
>>> blake2s(digest_size=10).hexdigest()
'1bf21a98c78a1c376ae9'
>>> blake2s(digest_size=11).hexdigest()
'567004bf96e4a25773ebf4'
15.1.4.3.3。 キー付きハッシュ
キー付きハッシュは、ハッシュベースのメッセージ認証コード(HMAC)のより高速で簡単な代替として、認証に使用できます。 BLAKE2は、BLAKEから継承された識別不能プロパティのおかげで、プレフィックスMACモードで安全に使用できます。
この例は、キーb'pseudorandom key'
を使用してメッセージb'message data'
の(16進エンコードされた)128ビット認証コードを取得する方法を示しています。
>>> from hashlib import blake2b
>>> h = blake2b(key=b'pseudorandom key', digest_size=16)
>>> h.update(b'message data')
>>> h.hexdigest()
'3d363ff7401e02026f4a4687d4863ced'
実際の例として、Webアプリケーションは、ユーザーに送信されたCookieに対称的に署名し、後でユーザーが改ざんされていないことを確認するためにそれらを検証できます。
>>> from hashlib import blake2b
>>> from hmac import compare_digest
>>>
>>> SECRET_KEY = b'pseudorandomly generated server secret key'
>>> AUTH_SIZE = 16
>>>
>>> def sign(cookie):
... h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)
... h.update(cookie)
... return h.hexdigest().encode('utf-8')
>>>
>>> def verify(cookie, sig):
... good_sig = sign(cookie)
... return compare_digest(good_sig, sig)
>>>
>>> cookie = b'user-alice'
>>> sig = sign(cookie)
>>> print("{0},{1}".format(cookie.decode('utf-8'), sig))
user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'
>>> verify(cookie, sig)
True
>>> verify(b'user-bob', sig)
False
>>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')
False
ネイティブのキー付きハッシュモードがありますが、もちろん、BLAKE2は hmac モジュールを使用したHMAC構築で使用できます。
>>> import hmac, hashlib
>>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)
>>> m.update(b'message')
>>> m.hexdigest()
'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'
15.1.4.3.4。 ランダム化されたハッシュ
salt パラメーターを設定することにより、ユーザーはハッシュ関数にランダム化を導入できます。 ランダム化されたハッシュは、デジタル署名で使用されるハッシュ関数に対する衝突攻撃から保護するのに役立ちます。
ランダム化されたハッシュは、一方の当事者であるメッセージ作成者が、他方の当事者であるメッセージ署名者によって署名されるメッセージの全部または一部を生成する状況向けに設計されています。 メッセージ作成者が暗号化ハッシュ関数の衝突(つまり、同じハッシュ値を生成する2つのメッセージ)を見つけることができる場合、同じハッシュ値とデジタル署名を生成するが結果が異なる意味のあるバージョンのメッセージを準備する可能性があります(例: 、$ 10ではなく$ 1,000,000をアカウントに転送します)。 暗号化ハッシュ関数は、衝突耐性を主な目標として設計されていますが、暗号化ハッシュ関数の攻撃に現在集中しているため、特定の暗号化ハッシュ関数の衝突耐性が予想よりも低くなる可能性があります。 ランダム化されたハッシュは、ハッシュ関数の衝突を見つけることが実際的である場合でも、作成者がデジタル署名生成プロセス中に最終的に同じハッシュ値を生成する2つ以上のメッセージを生成できる可能性を減らすことにより、署名者に追加の保護を提供します。 ただし、ランダム化されたハッシュを使用すると、メッセージのすべての部分が署名者によって準備されるときに、デジタル署名によって提供されるセキュリティの量が減少する可能性があります。
( NIST SP-800-106「デジタル署名のランダム化されたハッシュ」)
BLAKE2では、ソルトは、各圧縮関数への入力としてではなく、初期化中にハッシュ関数への1回限りの入力として処理されます。
警告
BLAKE2またはSHA-256などの他の汎用暗号化ハッシュ関数を使用したソルトハッシュ(または単にハッシュ)は、パスワードのハッシュには適していません。 詳細については、 BLAKE2 FAQ を参照してください。
>>> import os
>>> from hashlib import blake2b
>>> msg = b'some message'
>>> # Calculate the first hash with a random salt.
>>> salt1 = os.urandom(blake2b.SALT_SIZE)
>>> h1 = blake2b(salt=salt1)
>>> h1.update(msg)
>>> # Calculate the second hash with a different random salt.
>>> salt2 = os.urandom(blake2b.SALT_SIZE)
>>> h2 = blake2b(salt=salt2)
>>> h2.update(msg)
>>> # The digests are different.
>>> h1.digest() != h2.digest()
True
15.1.4.3.5。 パーソナライズ
ハッシュ関数に、異なる目的のために同じ入力に対して異なるダイジェストを生成させることが役立つ場合があります。 Skeinハッシュ関数の作者の引用:
すべてのアプリケーション設計者がこれを行うことを真剣に検討することをお勧めします。 2つのハッシュ計算が類似または関連するデータに対して行われたため、プロトコルの一部で計算されたハッシュをまったく異なる部分で使用できる多くのプロトコルを見てきました。攻撃者はアプリケーションにハッシュ入力を強制することができます。同じ。 プロトコルで使用される各ハッシュ関数をパーソナライズすることで、このタイプの攻撃を簡単に阻止できます。
(かせハッシュ関数ファミリー、p。 21)
BLAKE2は、 person 引数にバイトを渡すことでパーソナライズできます。
>>> from hashlib import blake2b
>>> FILES_HASH_PERSON = b'MyApp Files Hash'
>>> BLOCK_HASH_PERSON = b'MyApp Block Hash'
>>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'
>>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'
キーモードと一緒にパーソナライズを使用して、単一のキーからさまざまなキーを取得することもできます。
>>> from hashlib import blake2s
>>> from base64 import b64decode, b64encode
>>> orig_key = b64decode(b'Rm5EPJai72qcK3RGBpW3vPNfZy5OZothY+kHY6h21KM=')
>>> enc_key = blake2s(key=orig_key, person=b'kEncrypt').digest()
>>> mac_key = blake2s(key=orig_key, person=b'kMAC').digest()
>>> print(b64encode(enc_key).decode('utf-8'))
rbPb15S/Z9t+agffno5wuhB77VbRi6F9Iv2qIxU7WHw=
>>> print(b64encode(mac_key).decode('utf-8'))
G9GtHFE1YluXY1zWPlYk1e/nWfu0WSEb0KRcjhDeP/o=
15.1.4.3.6。 ツリーモード
次に、2つのリーフノードを持つ最小ツリーをハッシュする例を示します。
10
/ \
00 01
この例では、64バイトの内部ダイジェストを使用し、32バイトの最終ダイジェストを返します。
>>> from hashlib import blake2b
>>>
>>> FANOUT = 2
>>> DEPTH = 2
>>> LEAF_SIZE = 4096
>>> INNER_SIZE = 64
>>>
>>> buf = bytearray(6000)
>>>
>>> # Left leaf
... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,
... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
... node_offset=0, node_depth=0, last_node=False)
>>> # Right leaf
... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,
... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
... node_offset=1, node_depth=0, last_node=True)
>>> # Root node
... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,
... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
... node_offset=0, node_depth=1, last_node=True)
>>> h10.update(h00.digest())
>>> h10.update(h01.digest())
>>> h10.hexdigest()
'3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'
15.1.4.4。 クレジット
BLAKE2 によって設計されました Jean-Philippe Aumasson 、 サミュエル・ネベス 、 ZookoWilcox-O'Hearn 、 とクリスチャンウィナーラインに基づく SHA-3 ファイナリストブレイクによって作成された Jean-Philippe Aumasson 、 ルカ変善 、 ウィリーマイヤー 、 とラファエルC.-W. ファン 。
からのコアアルゴリズムを使用します ChaCha によって設計された暗号ダニエルJ. バーンスタイン 。
stdlibの実装は、 pyblake2 モジュールに基づいています。 Samuel Neves によって作成されたC実装に基づいて、 Dmitry Chestnykh によって作成されました。 ドキュメントは pyblake2 からコピーされ、 Dmitry Chestnykh によって作成されました。
Cコードは、 Christian Heimes によってPython用に部分的に書き直されました。
次のパブリックドメインの献身は、Cハッシュ関数の実装、拡張コード、およびこのドキュメントの両方に適用されます。
法律の下で可能な範囲で、作者はこのソフトウェアのすべての著作権および関連する隣接権を世界中のパブリックドメインに捧げています。 このソフトウェアは保証なしで配布されます。
このソフトウェアと一緒にCC0パブリックドメイン献身のコピーを受け取っているはずです。 そうでない場合は、 http://creativecommons.org/publicdomain/zero/1.0/を参照してください。
Creative Commons Public Domain Dedication 1.0 Universalに従って、次の人々がプロジェクトとパブリックドメインの開発を支援したり、変更を提供したりしました。
- アレクサンドルソコロフスキー
も参照してください
- モジュール hmac
- ハッシュを使用してメッセージ認証コードを生成するモジュール。
- モジュール base64
- 非バイナリ環境のバイナリハッシュをエンコードする別の方法。
- https://blake2.net
- BLAKE2の公式ウェブサイト。
- 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
- どのアルゴリズムに既知の問題があり、それがそれらの使用に関して何を意味するかについての情報を含むウィキペディアの記事。
- https://www.ietf.org/rfc/rfc2898.txt
- PKCS#5:パスワードベースの暗号化仕様バージョン2.0