2016-11-15 5 views
0

私は現在Pythonを学習しており、その言語の暗号化方法について学んでいます。そこでは、関数pbkdf2_hmac(hash_name、password、salt、iterations、dklen = None)がhashlibライブラリから見つかりました。パスワードベースのキー導出関数の反復2

ただし、パラメータiterationsは期待通りに機能しません。次の簡単なコードが示すように、1回の反復で2回関数を呼び出そうとすると、2回繰り返して1回呼び出すと、別の答えが返されます。ハッシュ関数は決定論的なので、両方の方法で同じ結果が得られるはずです。

import hashlib 
a=hashlib.pbkdf2_hmac("sha256",b"hallo",b"salt",1) 
b=hashlib.pbkdf2_hmac("sha256",a,b"salt",1) 
c=hashlib.pbkdf2_hmac("sha256",b"hallo",b"salt",2) 
print(b) 
print(c) 

誰かが間違ったことを教えてもらえますか?

答えて

1

PBKDF2の2回目の繰り返しは、PBKDF2(最初の繰り返し)だけではありません。

簡略化した説明は次のとおり

  • 1の反復:HMAC(password, salt || 00000001)
  • 2回の反復:HMAC(password, HMAC(password, salt || 00000001))
  • PBKDF2(PBKDF2):HMAC(HMAC(password, salt || 00000001), salt || 00000001)

なお、 "2回の反復" および「 PBKDF2(PBKDF2) "バージョンでは、2番目の計算に異なるHMACキーを使用します。これが異なる結果をもたらす理由です。

「ハッシュ関数は決定的です」という限りでは、以下のようになります。同じ入力でそれらを呼び出すと、同じ出力が得られます。基礎となるアルゴリズムの仕組みを誤解しているため、あなたはそれらに異なる入力を与えました。