2012-01-05 8 views
-1

私は春のセキュリティでハッシュコード隠密方法を書いています。その方法では、ソルト値と反復サイズをデータベースに保存します。次回は普通のパスワードでユーザーがログインすると、データベースからソルト値と繰り返しを使用し、パスワードをダイジェストします。しかし、このメソッドは、たとえ塩と反復の値が同じであっても、異なる世代のハッシュコードです。Digesterが同じメッセージ、コード、繰り返しに対して異なるハッシュコードを生成している理由

public Administrator encryptDigestCode(Administrator administrator) { 
    StandardStringDigester digester = new StandardStringDigester(); 
    Administrator admin = new Administrator(); 
    digester.setAlgorithm("SHA-256"); 
    digester.setStringOutputType("base64"); 
    Random ran = new Random(); 
    int iterate = ran.nextInt(1000); 
    digester.setIterations(iterate); 
    RandomSaltGenerator ram = new RandomSaltGenerator(); 
    byte[] salt = ram.generateSalt(10); 
    String pass = new String(salt) + administrator.getHashedPassword(); 
    String encryptedPassword = digester.digest(pass); 
    if (digester.matches(administrator.getHashedPassword(), 
      encryptedPassword)) { 
     admin.setLoginDetail(new LoginDetail()); 
     admin.getLoginDetail().setSalt(new String(ram.generateSalt(10))); 
     admin.getLoginDetail().setHashingCycle(iterate); 
     admin.setUserName(administrator.getUsername()); 
     admin.setSesamiagreementno(administrator.getSesamiagreementno()); 
     admin.setHashedPassword(encryptedPassword); 
    } else { 
     admin.setLoginDetail(null); 
     admin.setHashedPassword(null); 
     admin.setUserName(null); 
    } 
    return admin; 
} 

どうすればよいですか?参照用のコードまたはサイト。ありがとう

+0

実際のコードは、呼び出すたびに新しいランダムな塩を生成するコードではなく、ポストする必要があります。 –

+0

OK、塩の保存方法を指定しないため-1。 –

答えて

0

あなたはランダムソルトを使用するように見えます。 - もちろん、ハッシュは常に異なっています。


そして、私はこれも結果を流入することを期待する第2のランダム値

Random ran = new Random(); 
int iterate = ran.nextInt(1000); 
digester.setIterations(iterate); 

があります。だからあなたが運を持っていなければ、同じランダム値を2回取得します。ハッシュは異なります。

+0

こんにちはralph、はいランダムな塩を使用しますが、その値はユーザーログイン時に次回データベースに保存されます。私はデータベースにその塩の値を取得し、プレーンパスワードのユーザーを入力してからダイジェストします。しかし、データベースに保存されたハッシュコードは、2回目の生成時と異なります。 – sudo

+0

@ sudo:2番目のランダムな値があります。私は、いくつか間違いがあると感じている:ハッシュが計算される前に塩にパスワードを追加する必要がある - しかし、私は正しいコードを理解できないかもしれない – Ralph

0

ライン

admin.getLoginDetail().setSalt(new String(ram.generateSalt(10)));

は間違っています。まず、新しい塩を生成し、それを可変塩を使用するよりもむしろ のデータベースに入れます。私。 generateSaltを2回呼び出します。最初の結果はパスワードをハッシュするために使用され、2番目の結果はデー​​タベースに格納されます。次に、ランダムなバイト配列を文字列に変換します。 これらのバイトが印刷可能な文字に対応していない場合は、ここでbase64エンコーディングを使用します(もちろん、必要に応じて適切なデコードを行います)。

また、反復回数にランダムな整数を使用することは、あまり良い考えではありません。反復の回数は、計算コストが高い単一のターゲットに対する総当たり攻撃を行うべきです。ここで乱数を使用すると、攻撃者は反復回数が最も少ないユーザーを見つけようとして、このパスワードの攻撃を開始する可能性があります。

関連する問題