web-dev-qa-db-ja.com

このPBKDF2の実装は正しいですか?

私はプレゼンテーションの準備をしていますが、それが正しいことを再確認したいと思います。

PBKDF2は:

for (0,4096)
{
     data1 = HMACSHA1(data1, data2); 
     data2 = HMACSHA1(data2, data1);
}
where data1 and data2 are pass and respectively salt and
HMACSHA1 = SHA1(salt+SHA1(pass+salt))

これは正しいです?

1
Zodiac

あなたのループは2つの面で間違っています。

  1. DKの長さも重要です
  2. パスワードは再利用されます

wiki ページによると(または、必要に応じて [〜#〜] rfc [〜#〜] に移動できます):

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

どこ:

  • PRFは、出力長がhLenの2つのパラメーターの疑似ランダム関数です(例:キー付きHMAC)

.。

派生キーDKの各hLenビットブロックTiは、次のように計算されます。

_DK = T1 || T2 || ... || Tdklen/hlen_

Ti = F(Password, Salt, c, i)

F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc

どこ:

U1 = PRF(Password, Salt || INT_32_BE(i))

U2 = PRF(Password, U1)

_..._

Uc = PRF(Password, Uc-1)

WPA2は256ビットのDK(DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256))を使用します。SHA1の長さはわずか160ビットであるため、これに到達するにはプロセスに2つのブロック(Ti)が必要です。さらに、ここで説明する反復では、各反復の元のパスワード、つまりUi = PRF(Password, Ui-1)を使用するか、独自のループの各反復で変更されたパスワードを再利用します。

WPA2の簡易バージョンについては、次のように記述します。

_DK = B1 || trunc(B2)
B1 = F(Password, SSID || INT(1))
B2 = F(Password, SSID || INT(2))

where F(P, S) is the function

for(0, 4096) {
    U = HMAC-SHA1(P, S)
    S = U
}
_
1
M'vy