java中的SHA2密码散列

Posted

技术标签:

【中文标题】java中的SHA2密码散列【英文标题】:SHA2 password hashing in java 【发布时间】:2011-10-13 23:44:18 【问题描述】:

我正在尝试使用 SHA2 对一些密码进行哈希处理。

我在哪里可以获得用于制作的 java 代码的 sn-p?

我看过那个帖子,但我缺少一些东西: 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 行)

提前致谢

【问题讨论】:

仅供参考:您可能会阅读一些关于密码哈希的问题。虽然散列密码很好,但正确地执行它并非易事。这个问题有一些很好的答案:Suggestions for library to hash passwords in Java 【参考方案1】:

Phrase 将是您要保护的密码。 key 是盐,一个独特的(和已知的)字符串,在散列之前附加到您的密码,以击败彩虹表。或者至少应该是。您的代码只是从密码本身中获取它,这是毫无意义的。它应该是一个长的随机字符串,与密码摘要一起存储。

【讨论】:

【参考方案2】:

你可以考虑使用 commons-codec 的实现

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt");

【讨论】:

这不在 Java SE 中【参考方案3】:

首先,您需要明确自己想要做什么。您说您想对密码进行哈希处理,但您使用的代码是用于 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;

【讨论】:

【参考方案4】:

我修改了一点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;

【讨论】:

以上是关于java中的SHA2密码散列的主要内容,如果未能解决你的问题,请参考以下文章

SHA1 在 PBKDF2 中用作散列函数是不是仍然安全?

我可以检查散列密码是不是等于 laravel 中的特定值?

Golang 中的 Bcrypt 密码散列(与 Node.js 兼容)?

如何使用散列 bcrypt 版本更新数据库中的每个密码?

Spring Security 批量密码散列

为啥密码散列函数中的冲突检测使查找其他冲突更容易?