12

SHA2 でいくつかのパスワードをハッシュしようとしています。

それを行うためのJavaコードのスニペットはどこで入手できますか?

その投稿を見たことがありますが、何か足りないものがあります: Javaを使用したSHA2パスワードストレージ

 Mac mac = Mac.getInstance("HmacSha256");
 SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSha256");
 mac.init(secret);
 byte[] shaDigest = mac.doFinal(phrase.getBytes());
 String hash = "";
 for(byte b:shaDigest) {
     hash += String.format("%02x",b);
 }

フレーズは、エンコードしたい文字列ですよね?そして、鍵は何ですか(2行目)

前もって感謝します

4

4 に答える 4

25

まず、自分が何をしたいのかを明確にする必要があります。パスワードをハッシュしたいと言いますが、使用しているコードは MAC ( Message Authentication Code )、具体的にはHMAC用です。

ハッシュと MAC は、目的が異なれば別のものです (ただし、HMAC にはハッシュの使用が含まれます)。要件に適したものを使用していることを確認する必要があります。

キーの提供を求められているのは、MAC にキーが必要だからです。ハッシュは次のことを行いません。

public byte[] hash(String password) throws NoSuchAlgorithmException {
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");        
    byte[] passBytes = password.getBytes();
    byte[] passHash = sha256.digest(passBytes);
    return passHash;
}
于 2011-07-27T11:12:57.473 に答える
15

rossum のコードを少し修正し、salt を追加し、戻り値の型を String に変換し、try/catch を追加しました。

    public String hash(String password) {
    try {
        MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
        String salt = "some_random_salt";
        String passWithSalt = password + salt;
        byte[] passBytes = passWithSalt.getBytes();
        byte[] passHash = sha256.digest(passBytes);             
        StringBuilder sb = new StringBuilder();
        for(int i=0; i< passHash.length ;i++) {
            sb.append(Integer.toString((passHash[i] & 0xff) + 0x100, 16).substring(1));         
        }
        String generatedPassword = sb.toString();
        return generatedPassword;
    } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }       
    return null;
}
于 2014-08-21T12:29:26.677 に答える
10

commons-codec の実装の使用を検討することができます

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt");
于 2011-07-27T09:10:22.420 に答える
1

フレーズは、保護しようとしているパスワードになります。 keyレインボー テーブルを無効にするために、ハッシュする前にパスワードに追加される一意の (既知の) 文字列であるソルトです。または、少なくともそうあるべきです。あなたのコードはパスワード自体からそれを取得しているだけであり、これは無意味です。これは、パスワード ダイジェストと一緒に保存される長いランダムな文字列である必要があります。

于 2011-07-27T06:29:49.210 に答える