2

私はセキュリティの専門家ではなく、ほとんどのアプリがローカルイントラネットで実行されているため、セキュリティについてあまり考えていません。:)

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

GlassfishにJDBCレルムを設定し、インターネットからのこのコードを使用してMD5ハッシュでパスワードを保存しています。

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);
    }
}

今私の質問は、パスワードの変更のユースケース中に...入力されたパスワードが以下のコードのように私のDBにあるものと同じであるかどうかを検証するためにハッシュが等しいかどうかを比較するだけですか?

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は一方向のハッシュであるため、パスワードを文字列に復号化できないことをどこかで読んだことがありますか?

申し訳ありませんが、私の質問が単純すぎる場合でも、理解を確認したいのですが。

ありがとう

4

2 に答える 2

2

同じパスワードは常に同じ値にハッシュされるので、話しているチェックを行うことができます。また、一般的にハッシュ関数を元に戻すことはできません。つまり、あるパスワードのハッシュが与えられた場合、ハッシュが与えられたパスワードを推測することはできません。ただし、 MD5は壊れているため、代わりに他のハッシュ関数(SHA-256など)を使用する必要があります。これを実際に安全に行うには、レインボーテーブル攻撃を防ぐために、パスワードをハッシュする前にパスワードをソルトする必要があることにも注意してください。

于 2012-04-19T04:26:49.417 に答える
0

はい、同じ入力文字列が与えられると、ハッシュは同じ値に計算されます。これにより、プレーンテキストのパスワードではなくハッシュをデータベース内に保存できるようになります。2つのハッシュを比較して、入力文字列が等しいかどうかを判断できることは間違いありません。

また、MD5は一方向のハッシュであるため、元の文字列に変換することはできません。ただし、それでも、攻撃者が一般的なパスワードに対して辞書攻撃を実行するのを防ぐことはできません。セキュリティを強化するために、アプリケーションにソルトを導入することをお勧めします。このように、データベースが危険にさらされた場合、攻撃者はソルトが何であるかを発見する必要があり、これは些細な辞書攻撃を打ち負かします。

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

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

于 2012-04-19T04:47:08.127 に答える