30

私は、データベース内のパスワードのストレージを- 生成されたPBKDF2ハッシュとして指定する Java 認証サブシステムに取り組んでおり、現在、使用するSHA1SHA512PRF として使用するかを決定しようとしています。私は両方の仕様を調べましたが、それらは私が従うには数学的に非常に集中的です. PBKDF2WithHmacSHA512暗号をよく理解している人は、 との違いを説明できますかPBKDF2WithHmacSHA1?

これが私がやろうとしていることです:

private static final int HASH_BYTE_SIZE = 64 * 8; // 512 bits
private static final int PBKDF2_ITERATIONS = 1000;      

// generate random salt
SecureRandom random = new SecureRandom();
byte salt[] = new byte[SALT_BYTE_SIZE]; // use salt size at least as long as hash
random.nextBytes(salt);

// generate Hash
PBEKeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // we would like this to be "PBKDF2WithHmacSHA512" instead? What Provider implements it?
byte[] hash = skf.generateSecret(spec).getEncoded();

// convert hash and salt to hex and store in DB as CHAR(64)...
4

2 に答える 2

61

単語を少しずつ分解してみましょう。

PBKDF2--WithHmac--SHA512

部分的に見ていきましょう

  • PBKDF2

    PBKDF1 の後継である Password-based-Key-Derivative-Function の略で、入力パスワードまたはパスフレーズに暗号化ハッシュ、暗号、または HMAC などの疑似ランダム関数をソルト値とともに実装するために使用され、プロセスを繰り返します。その後の操作で暗号化キーとして使用できる派生キーを生成します。

  • HMAC

    Keyed-Hash Message Authentication Code (HMAC) の略で、秘密の暗号化キーと組み合わせた暗号化ハッシュ関数を含むメッセージ認証コード (MAC) を計算するための特定の構造です。HMAC の計算には、任意の暗号化ハッシュ関数を使用できます。結果として得られる MAC アルゴリズムは、それに応じて HMAC-MD5 または HMAC-SHA1 と呼ばれます。

  • SHA512

    まあ、あなたはそれについて知っています.. :P

さて、あなたの質問に戻って、コード行:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

アルゴリズムを使用する keyFactory を指定しますPDBKDF2WithHmacSHA1。次のようなことをするとき:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");

ファクトリにアルゴリズムを使用するように指示しますPBDKF2WithHmacSHA512

PBKDF2WithHmacSHA1基本的にとの主な違いPBKDF2WithHmacSHA512は次のとおりです。

  1. 160 ビットのハッシュ長を生成しPBKDF2WithHmacSHA1ます。
  2. 512 ビットのハッシュ長を生成しPBKDF2WithHmacSHA512ます。

したがって、後者の方が安全です。しかし、どちらが暗号化に十分かについては、双方に議論があります。議論はありません。ただ言って。

2 つのアルゴリズムに関する追加情報:

  1. HMACSHA1

    HMACSHA1 は、SHA1 ハッシュ関数から構築され、HMAC またはハッシュベースのメッセージ認証コードとして使用されるキー付きハッシュ アルゴリズムの一種です。HMAC プロセスは、秘密鍵をメッセージ データと混合し、ハッシュ関数を使用して結果をハッシュし、そのハッシュ値を秘密鍵と再度混合してから、ハッシュ関数をもう一度適用します。出力ハッシュの長さは 160 ビットです。

  2. HMACSHA512

    HMACSHA512 は、SHA-512 ハッシュ関数から構築され、ハッシュベースのメッセージ認証コード (HMAC) として使用されるキー付きハッシュ アルゴリズムの一種です。HMAC プロセスは、秘密鍵をメッセージ データと混合し、結果をハッシュします。ハッシュ値は再び秘密鍵と混合され、2 回目のハッシュが行われます。出力ハッシュの長さは 512 ビットです。

主な利点は、HmacWith512よりも安全であることですHmacWith256。例えば

HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a

違いはかなり大きいです(ご覧のとおり)。それが役に立てば幸い。:)

編集: OPが言及しているように

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)

このパラメーターkeyLengthは、可変鍵サイズ暗号の鍵の長さの設定を示すために使用されます。実際のキー サイズは、各プロバイダーの実装によって異なります。したがって、次のようなことを言う

PBEKeySpec(password, salt, int 100, 512)SHA1 を使用して 512 の keyLength を生成するという意味ではありません。単にそれを意味します。SHA1 は最大 160 ビットまでサポートします。それを超えることはできません。

2 番目の質問については、HMAC-SHA1 をご覧ください。SHA256長いハッシュの場合、次のようなアルゴリズムは非常に優れていると言う多くのステートメントがあります。

また、NSAによると:

NSA は、「FIPS-186-2 および SHA-256 で指定されている 256 ビット素数モジュラス楕円曲線を使用する楕円曲線公開鍵暗号方式は、機密情報を SECRET レベルまで保護するのに適している」と指定しています。384 ビット素数の使用TOP SECRET情報の保護には、モジュラス楕円曲線とSHA-384が必要です。

SHA512 と組み合わせて HMAC 関数を使用すると、非常に安全だと思います。

于 2013-10-13T19:19:27.793 に答える
2

SHA512 は、暗号化ハッシュ関数の SHA2 ファミリに属します。SHA1 には理論上の弱点があり、SHA512 は SHA1 よりもわずかに遅いため (パスワードをハッシュする場合は遅いほど良い)、パスワードをハッシュする目的で SHA1 よりも SHA512 (または SHA2 ファミリのいずれか) を選択する必要があります。

機能の違いを実際に理解するのは簡単ではありませんが、Crypto SE サイトで回答を得られる可能性が高くなります。

于 2013-10-13T19:13:16.130 に答える