-1

Md5 でパスワードを変換していますが、正常に機能し、md5 に変換されたパスワードを取得していますが、md5 パスワードに特殊文字も含めたいと考えています。

どうすればこれを達成できますか

public String createMd5(String password){
    String salt = "Random$SaltValue#WithSpecialCharacters12@$@4&#%^$*";
    String hash = md5(password + salt);
    return hash;
}

public static String md5(String input) {
    String md5 = null;
    if(null == input) return null;
    try {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        digest.update(input.getBytes(), 0, input.length());
        md5 = new BigInteger(1, digest.digest()).toString(32);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return md5;
}
4

3 に答える 3

2

md5()任意の文字列から {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}^32 にマップするハッシュ関数です。

通常、攻撃が成功した場合 (攻撃者がユーザー データを取得できることを意味します)、攻撃者がすべてのユーザーの平文パスワードを持っていないことを確認したい場合に使用します (そして、この情報で電子メール アカウントをハッキングします)。

md5() から特殊文字を取得することはできず、何も改善されません。

警告: MD5 は計算が速すぎるため、パスワードのハッシュには使用しないでください (詳細情報)。代わりに、saltを使用してbcryptを使用する必要があります ( example )。

于 2013-08-04T11:51:10.987 に答える
1

この質問は、パスワードハッシュの誤解から生じていると思います。ハッシュされたパスワードは次のように機能します。

  • ハッシュ関数は決定論的です。つまり、同じ入力を使用すると、常に同じ出力が得られます。
  • 優れたハッシュ関数は一方向性です。つまり、多大な努力なしではハッシュ値から入力値を取得することはできません。
  • したがって、パスワード + ソルトを使用します (ソルトを使用すると、完全な辞書を作成するのが非常に難しくなります)
  • それをハッシュ関数にフィードして、ハッシュを生成します。
  • ハッシュとソルトを保存します。
  • パスワードをチェックするには、ユーザー入力と保存されたソルトをハッシュし、保存されたハッシュと比較します。

これはバイト レベルで動作するため、入力には明らかに特殊文字が含まれます。ハッシュ関数の出力は便宜上 16 進数で表されており、特殊文字は含まれていません。生の出力が必要な場合は、16 進表現をバイトに解析するだけですが、なぜそうしたいのかわかりませんが、同じ数の出力ビットが異なる方法で表現されています。

注意すべきもう 1 つの点: MD5 は速すぎるため、パスワードの適切なハッシュ関数ではありません。本当に高速なハッシュ関数とは、ジェネレーターから大量のパスワードを試すのが簡単なタスクであるハッシュ関数です。このユース ケースでは、より具体的なパスワードを探す必要があるかもしれません。

于 2013-08-04T13:31:50.887 に答える