2011-01-13 4 views
1

私はJavaのSecureRandomクラスを使用して、後で暗号化とパスワードのハッシュを行うための塩を生成しています(各タスクごとに別々の塩を生成しています)。私が使っているコードは次の通りです:JavaとCryptographically Strong乱数

私が実際に持っている値を検証するまで、すべてがうまくいっていました。アプリケーションのいくつかの連続実行のために私の塩であった:私は数字すべてがおおよそシーケンシャルのように見えるという事実によって妨害されています

[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 
[[email protected] 

。ウェブ上で検索した後、私は同じ結果に自分自身を播種せずにランを再度繰り返しました。

これは私がAndroidプラットフォーム用に開発しているという事実に起因する可能性があります。彼らは彼ら自身の暗号化プロバイダを持っていることを知っていますが、私は例外がありません。何か案は?

ありがとうございます。

答えて

9

内容の代わりにバイト配列への参照を印刷しているようです。これがシーケンシャルな理由です。リファレンスは基本的にJVMメモリ内の位置を示しています。バイト配列を文字列に変換してから出力してください。

String saltContents = Arrays.toString(bytAuthSalt); 

あなたのバイトの生の値を表示しますArraysを使用して文字列に配列を変換します。

+3

私が間違っていないと、それは生のバイトを出力するのではなく、デフォルトのcharsetを使ってバイトを解釈することになります。 OPは、ASCII相当の文字ではなく生のバイトを必要としませんか? –

+1

@ RD01 - それでも、それはOPに値のランダム性の良い見方を与えるでしょう。 – Rogach

+2

@rogach私は同意しますが、これらの値の多くはctrl-charsまたはwhitespaceとして表示されるため、すべてのバイトを評価することはできません。 –

4

実際の値ではなく、配列を印刷しているようです。 "[B @"はそれがバイト配列であり、その後ろのすべてがオブジェクトIDであることを示します。

System.out.println("bytAuthSalt"); 
    for (byte b : bytAuthSalt) { 
    System.out.print(b); 
    } 
    System.out.println(); 

またはこの:

Arrays.toString(bytAuthSalt); 

これは、アレイ内のすべての値を印刷し
はこのような何かを試してみてください。

+3

またはArrays.toString(byte []) –

+0

ああ、ありがとう!それを知らなかった。 – Rogach

+0

"[B @"がバイト配列のシグニチャであることについてのビットを知らなかった。 – phobos51594

1

また、すべてのプラットフォームで正しく動作することが保証されていないため、System.nanoTime()の種蒔きには使用しないことをお勧めします。場合によっては、「ゼロ」を返す場合もありますが、RNGをシードするのに正しい数ではないと思います。

2

SHA1PRNGはその種子としてのみ安全です。この理由から、System.nanoTime()を種として使用することは恐ろしい考えです。シーディングの時間範囲を十分に狭めることができる攻撃者は、一致するシーケンスが見つかるまで、可能な値をすべて試すことができます。攻撃者は、通常、System.nanoTime()の解像度は1ナノ秒よりもはるかに大きいという事実によって助長されます。

new SecureRandom()を実行して、JREが最良の実装を選択できるようにする方がはるかに優れています。ほとんどのプラットフォームでは、OS固有のエントロピーソースを使用して/dev/randomなどのRNGをシードします。