6

プレーンテキスト ファイルに保存されたユーザー パスワードの機密性と整合性を確保する必要がある 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

13

混乱が見られると思います。コードが PBKDF2 を適用してから HMAC-SHA-1 を適用することを期待しているようです。それはそれがどのように機能するかではありません: HMAC-SHA-1 は PBKDF2 内で使用されます。

PBKDF2の要点は、次のプロパティを持つ関数を繰り返し適用することです。

  • 2 つの引数を取ります。
  • 固定サイズの値を返します。
  • 疑似乱数関数と実質的に区別できません。

HMAC-SHA-1 はそのような関数であり、一般的な選択です。HMAC-MD5、HMAC-SHA-256、またはその他の関数を使用する PBKDF2 の他のバリアントがあります (ただし、これらのバリアントは基本的な Java ライブラリにはありません)。

PBKDF2 は、パスワードとソルトの 2 つのデータ入力 (およびいくつかの構成入力) を取ります。計算に秘密の値を含めたい場合は、PBKDF2 の入力を使用してください。その上にカスタム スキームを追加しないでください (独自の暗号化を行うことは、間違ったことをするためのレシピです)。ペッパー(すべてのアカウントに共通のシークレット値) をソルト (アカウント間で異なるパブリック値) に追加します。

ペッパーの有用性は限られていることに注意してください。ハッシュとペッパー シークレット値が別の場所に保存されている場合にのみ役立ちます。たとえば、ハッシュがデータベースにあり、ペッパーが SQL インジェクション攻撃に対して直接脆弱ではないディスク ファイルにある場合などです。

于 2013-11-18T10:49:13.803 に答える