12

我正在尝试使用 SHA2 散列一些密码。

我在哪里可以得到一段 java 代码来制作它?

我看过那篇文章,但我缺少一些东西: SHA2 password storage with Java

 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(消息身份验证代码),特别是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 回答