1

プレーンテキスト ファイルに保存されたユーザー パスワードの機密性を確保する必要がある Java プロジェクトに取り組んでいます。

そのために、パスワードのハッシュのみをファイルに書き込みます。より具体的には、レインボー テーブルとルックアップ テーブルの使用を避けるために、パスワードのハッシュとランダム ソルト、およびランダム ソルト自体を作成することを意図しています。また、PBKDF2 でキーストレッチングを使用して、ハッシュの計算を計算コストの高いものにしたいと考えています。最後に、保護の最終層として鍵付きハッシュ アルゴリズム HMAC を使用したいと思います。

私は自分の考えを Java コードに実装しようとしていますが、上に示した操作の例をいくつか見つけました。

private static byte[] pbkdf2(char[] password, byte[] salt, int iterations, int bytes)
    throws NoSuchAlgorithmException, InvalidKeySpecException
{
    PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes * 8);
    SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    return skf.generateSecret(spec).getEncoded();
}

私が本当に理解できないのは、関数への入力ではないように見えるため、HMAC アルゴリズムで使用されるキーとして秘密キーを入力する方法です。Java のドキュメントに目を通しましたが、質問に対する解決策が見つかりません。

4

1 に答える 1

1

キー ストレッチングのために PBKDF2 によって内部的に使用される HMAC 関数について話している場合、キーを提供する必要はなく、入力からキーが作成されます。

PBKDF2 を使用して HMAC 関数のキー マテリアルを作成する場合は、以下が機能します。

暗号で行うのと同じ方法で Mac 関数を初期化します。

上記の方法を使用しますpbkdf2

byte[] key = pbkdf2(password, salt, 1000, 16)
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(key, "HmacSHA1");

byte[] macResult = mac.doFinal(...);
于 2013-11-08T15:22:39.970 に答える