从SHA哈希到密码

时间:2019-03-03 12:42:07

标签: java string hash passwords

因此,我已经编写了此代码以将密码转换为哈希值,现在我想将哈希值转换回字符串。如何做到这一点?

package security;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashPassword {

    public static String hashPassword(String password) throws NoSuchAlgorithmException 
    {
        MessageDigest sha= MessageDigest.getInstance("SHA");
        sha.update(password.getBytes());
        byte [] b=sha.digest();
        StringBuffer sb= new StringBuffer();
        for(byte b1:b)
        {
            sb.append(Integer.toHexString(b1 & 0xff).toString());
        }

        return sb.toString();
    }
    public static void main(String[] args) 
    {
       String password="1234";
       System.out.println(password);
       try
       {
       System.out.println(hashPassword(password));
       }catch(NoSuchAlgorithmException e)
       {}
    }

}

3 个答案:

答案 0 :(得分:1)

散列密码的全部目的是实现一件事:使其尽可能难以从其散列版本中获取原始密码。

无论如何,您永远不需要该原始密码。您只需保留哈希(加盐!)密码,然后每当需要再次验证用户身份时,便要求输入用户密码,对其进行哈希处理,然后检查该密码是否与您先前存储的持久哈希密码相匹配。

因此:尽管有时可以从其哈希中获取密码,但这只是您不关心的事情(除非您是想评估哈希实现质量的密码学家)。

答案 1 :(得分:1)

正如其他人指出的那样,散列并不意味着被“转换”回其原始值。出于这个确切的原因,数据库中使用散列来存储密码。使用哈希存储在数据库中,即使我有权访问该数据库,也无法弄清楚存储在该数据库中的密码。

现在,根据您对哈希的使用情况,您可以尝试多种操作:

1。
您只想让密码变得不可读,并且需要一段时间才能读取
在这种情况下,您可以使用加密和解密算法而不是哈希方法。这样,您可以根据需要取回原始值。

举个简单的例子:https://www.thejavaprogrammer.com/caesar-cipher-java-encryption-decryption/
从不使用加密来存储密码。

2。
您想实现一个将密码存储为哈希的登录/注册服务/系统。
如果您要这样做,我建议您使用友好的bcrypt:https://en.wikipedia.org/wiki/Bcrypt < br />今天,bcrypt在某种程度上已经成为哈希密码和其他信息的标准。 Java实现还提供了一种检查输入的密码是否与存储的密码匹配的好方法。因此,您不必花几天时间就可以破解哈希值,只需检查密码即可。

bcrypt的Java实现可在以下位置找到:http://www.mindrot.org/projects/jBCrypt/


答案 2 :(得分:0)

您可以尝试用Rainbow table

破解它