2013-10-13 22 views
9

私はPBKDF2生成ハッシュとしてDBのパスワードの記憶を仕様するJava認証サブシステムに取り組んでいます。今ではSHA1SHA512をPFRとして使用するかどうかを決定しようとしています。私は両方の仕様を調べましたが、それらは非常に数学的に集中しており、私はそれに従っています。 PBKDF2WithHmacSHA512PBKDF2WithHmacSHA1とどのように違うのかを、より良い暗号理解の人が説明できますか?ここでPBKDF2WithHmacSHA512対。 PBKDF2WithHmacSHA1

は私がやろうとしているものです:

private static final int HASH_BYTE_SIZE = 64; // 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)... 

答えて

0

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

実際に機能の違いを理解することは簡単ではありませんが、Crypto SE siteで回答を得るチャンスがあるかもしれません。

+0

右はスピード(または欠落)が重要です。しかし、PBKDF2には調整可能な作業係数が含まれています。したがって、SHA512対SHA1の相対速度は無関係です。 –

34

は私たちに作品別の内訳単語ピースをしてみましょう:

PBKDF2--WithHmac--SHA512 

は、の各パ​​ーツその上にパスワードベース・キー・デリバティブ用スタンド

  • PBKDF2

    を行ってみよう-Functionは、PBKDF1の後継であり、暗号ハッシュ、暗号、またはHMACなどの擬似乱数関数を実装するために使用されます入力されたパスワードまたはパスフレーズをソルト値と共に取得し、このプロセスを何度も繰り返して派生キーを生成し、派生キーをその後の操作で暗号キーとして使用することができます。

  • 鍵付きハッシュメッセージ認証コード(HMAC)スタンド

    HMAC

    秘密暗号鍵との組み合わせで暗号ハッシュ関数を含むメッセージ認証コード(MAC)を計算するための具体的な構成です。暗号ハッシュ関数は、HMACの計算に使用することができます。結果として生じるMACアルゴリズムは、それに応じてHMAC-MD5またはHMAC-SHA1と呼ばれる。

    さて、あなたはそれについて

  • SHA512を知っている..:P

を今、あなたの質問、コードの行に戻ってくる:

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

指定keyFactoryアルゴリズムを使用するPDBKDF2WithHmacSHA1

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

あなたはアルゴリズムPBDKF2WithHmacSHA512を使用するように工場に指示します。

  1. PBKDF2WithHmacSHA1160ビットのハッシュ長を生成する:

    Essentialy PBKDF2WithHmacSHA1PBKDF2WithHmacSHA512の間の主な違いは、ということです。

  2. PBKDF2WithHmacSHA512は、512ビットのハッシュ長であるを生成します。

したがって、後者はより安全です。しかし、両者には暗号化に十分な議論がある。討論はしない。ただ言って。

2つのアルゴリズムについてのいくつかの追加情報:

  1. HMACSHA1

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

  2. HMACSHA512

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

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

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 

違いはかなり大きい(見ているように)。それが役に立てば幸い。 :)

EDIT: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 に指定されている256ビットの素数モジュラス楕円曲線を用​​いた楕円曲線公開鍵暗号」と指定し、SHA-256

SECRETレベルまで の機密情報を保護するために適切である。楕円曲線 およびSHA-384は、TOP SECRET 情報の保護のために必要である384ビットの素数モジュラスの使用。

HMAC機能を併用すると、SHA512はかなり安全だと思います。

+1

'PDBKDF2WithHmacSHA1'と' PDBKDF2WithHmacSHA512'の主な違いは、それぞれ異なるハッシュ長(それぞれ160bits対512bits)を生成することです。しかし、PBEKeySpec(char [] password、byte [] salt、int iterationCount、int keyLength)の 'keyLength'引数が生成されたハッシュの長さを管理するので、これは正しいとは思わない。 '512'、' 256'、 '160'を指定して実行すると、長さの異なるそれぞれのハッシュを取得します。 – DTs

+0

"どちらに暗号化に十分であるかについての両側に引数があります"。すべてのリンクが評価され、私はそれを読んでみたいと思います。私は 'SHA1'と' SHA512'の比較を見つけることができますが、 'PDBKDF2WithHmacSHA1'と' PBKDF2WithHmacSHA512'の比較はありません。 Btw、私は 'SecretKeyFactory.getInstance(" PBKDF2WithHmacSHA512 ");'をやってみましたが、もともとは 'NoSuchAlgorithmException'をスローしています。 'javax.crypto'には含まれていませんか?私はそれを使用したいと思いますが、IAIKとは別にプロバイダを見つけることができません(彼らはJCEライブラリに数千ドルを請求します)。他のオプションを知っている人は誰ですか? – DTs

+0

生成されたハッシュの長さが長いほど「より安全な」ハッシュ方法の指標であることを意味します。特定の種類の攻撃に対するハッシュ長の影響に関するコメントを提供することなく、そのようなことはむしろ投機的であると言っています。例えば、ハッシュされた値(例えば、パスワード)が十分に短く、例えば8文字であることが分かっている場合、ハッシング法の出力がどれくらい大きいかは実際には違いはなく、十分に速く計算できる限り、 -force攻撃はまだ実行可能です。 –

関連する問題