6

私はこれを尋ねるのはかなりばかげているように感じますが、答えがわからないので、とにかく先に進みます。

私はいくつかの認証コードを試していて、Rfc2898DeriveBytes から取得したバイト配列を HEX に変換し、HMACSHA1 オブジェクトを正しく初期化するために再びバイト配列に戻す必要がある理由を知りたいと思っています。何かばかげたことをしているように感じます。 、または単に明らかな何かが欠けています。

私のクライアント コードは、 crypto-jsに基づく JavaScript 関数です。

var key256bit = Crypto.PBKDF2(passwordEntered, saltBytes, 32, { iterations: 1000 }); 
var hmacBytes = Crypto.HMAC(Crypto.SHA1, url, key256bit, { asBytes: true });
var base64Hash = Crypto.util.bytesToBase64(hmacBytes);

私のサーバー側のコードは次のとおりです。

    Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password,
                                              encoding.GetBytes(salt), 1000);
    byte[] key = rfc2898.GetBytes(32);

    // Don't think I should need to do this. 
    // However, it wont work if I initialise HMACSHA1 
    // with the rfc2898.GetBytes(32)
    string test = ByteArrayToString(key); 

    HMACSHA1 hmacSha1 = new HMACSHA1(encoding.GetBytes(test));
    
    byte[] computedHash = hmacSha1.ComputeHash(encoding.GetBytes(requestUri));
    string computedHashString = Convert.ToBase64String(computedHash);

Web から取得した ByteArrayToString メソッドは次のとおりです。

private static string ByteArrayToString(byte[] ba)
{
    StringBuilder hex = new StringBuilder(ba.Length * 2);
    foreach (byte b in ba)
        hex.AppendFormat("{0:x2}", b);
    return hex.ToString();
}

への呼び出しから 32 バイトを取得していることがわかりますrfc2898.GetBytes(32)。ByteArrayToString メソッドを使用してこれを HEX に変換し、Javascript 変数 key256bit に表示されているものと一致することを確認しました。これで、テスト変数は長さ 64 の文字列になり、encoding.GetBytes(test) を使用して HMACSHA1 のコンストラクターに渡すと、長さ 64 のバイト配列になります。

crypto-js の doco が少し不足していますが、Crypto.PBKDF2 を param 32 で呼び出すと、32 バイト長 (または 256 ビット) のキーが作成されていると思いました。

説明をいただければ幸いです。

4

1 に答える 1

3

PBKDF2.jsで、これが問題の原因であると思われます。

return options && options.asBytes ? derivedKeyBytes :
       options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
       util.bytesToHex(derivedKeyBytes);

asBytesまたはのいずれにもオプションを指定していないためasString、C# コードと同様に、キーを 16 進表現に変換しています。したがって、現時点では「元のキー」の各バイトから 2 バイトの「使用済みキー」を生成しているため、512 ビットのキーを使用しています。

Javascriptでオプションを指定するasBytesと、C#コードに余分な16進部分がなくても機能すると思います。

繰り返しになりますが、PBKDF2 はこれまでに見たことがないので、ベースから外れている可能性があります...

于 2012-04-19T06:35:24.933 に答える