2012-04-19 18 views
2

私はセキュリティ専門家ではなく、多くのアイデアをローカルのイントラネット上で実行しているので、あまり考えていないので、 はセキュリティを気にしていますか? :)MD5ハッシュを比較することに関して

しかし、実際には、私はそれを正しくしようとしています。

glassfishにJDBC領域を設定しました。インターネットからこのコードを使用してMD5ハッシュを使用してパスワードを保存しています。ハッシュは、入力されたパスワード は、以下のコードのように私のDBにあるものと同じであるかどうかを検証することが等しい場合

public static String getMD5(String input) 
{ 
    try 
    { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update(input.getBytes()); 

     byte byteData[] = md.digest(); 

     //convert the byte to hex format method 1 
     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < byteData.length; i++) 
     { 
     sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 
            16).substring(1)); 
     } 
     return sb.toString(); 
    } 
    catch (NoSuchAlgorithmException e) 
    { 
     throw new RuntimeException(e); 
    } 
} 

今、私の質問はそれだけで比較している...パスワード変更のユースケースの間に、ありますか?

public static void main(String[] args) 
throws NoSuchAlgorithmException 
{ 
String currentPassword = "java"; 
String inputValue = "java1"; 

String string1 = getMD5(currentPassword); 
String string2 = getMD5(inputValue); 

System.out.println("Is equal = " + string1.equals(string2)); 
} 

私は、MD5はそう、私は文字列にパスワードを戻って復号化することはできませんハッシング一つの方法であることをどこかで読んだことがありますか?

申し訳ありませんが、私の質問が単純すぎる場合は私の理解を確認したいと思いますか?

おかげ

答えて

3

同じパスワードが常に同じ値にハッシュされますので、あなたが話しているのチェックを行うことができます。また、一般的には、ハッシュ関数を逆にすることはできません。つまり、あるパスワードのハッシュが与えられた場合、そのハッシュを与えられたパスワードを推論することはできません。しかしMD5 has been brokenなので、(SHA-256のように)代わりに他のハッシュ関数を使うべきです。実際にこれを安全に行うには、レインボーテーブル攻撃を防ぐためにパスワードをハッシュする前にソーキングする必要があります。

1

はい、同じ入力文字列を指定すると、ハッシュは同じ値に計算されます。これにより、データベースの内部に平文のパスワードではなくハッシュを格納することができます。 2つのハッシュを比較して、入力文字列が等しいかどうかを判断することができます。

MD5が片方向ハッシュなので、元の文字列に戻すことはできません。しかし、それは攻撃者が共通のパスワードに対して辞書攻撃を行うのを止めるものではありません。セキュリティを強化するために、アプリケーションに塩を導入することもできます。このようにして、データベースが侵害された場合、攻撃者は塩の存在を発見しなければならず、これは簡単な辞書攻撃に打ち勝つことになります。

return getMd5("myS3cre7V4lu3" + inputValue) == getMd5(valueRetrievedFromDatabase) 

http://en.wikipedia.org/wiki/Salt_(cryptography)

+0

パスワードファイルが危険にさらされてもよいが、塩はばかばかしいではありませんという考え。塩のポイントは、事前計算された攻撃を防ぐことです。個々のランダムな塩がなければ、敵対者は各パスワードを個別に攻撃する必要があります。塩がなければ、パスワードは虹のテーブル(パスワードが計算された形式であると仮定して)で簡単に解読することができます。この回答のように、シードが一定であれば、ソフトウェアを使用するすべてのパスワードを一度に攻撃することができます。そして、妥協の後、ソフトウェアを修正して再構築する必要があります(あなたは危機でそれを確実にしたいと思っていますか?)。 –

+0

パスワードと一緒にランダムな塩を格納するために、上記の実装を変更する必要があることに同意します。しかし、私は、入力にもう1つのランダム性があるというもう1つの入力を持っていると、セキュリティの別の障壁が加わると思います。データベースがWebサーバーなしで侵害されたり、DBの内容を公開するSQLインジェクションのバグが存在する可能性はありますか?この特定の場合、この追加の秘密情報の追加は、攻撃者がウェブインスタンスをデータベース内のあらかじめコンパイルされた値に妥協しなければならないことを意味します。 –

+0

Davidさん、ありがとうございました! –

関連する問題