从 SHA 哈希到密码

From SHA hashing to password

所以我编写了这段代码来转换我的密码的哈希值,现在我想获取哈希值并将其转换回字符串。如何实现?

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)
       {}
    }

}

你可以尝试用Rainbow table

破解

散列密码的全部意义在于实现一件事:尽可能难以从其散列版本获取原始密码。

反正你永远不需要那个原始密码。您只需保留散列(和加盐!)密码,每当您需要再次对用户进行身份验证时,您会询问他的密码,对其进行散列,并检查它是否与您之前存储的持久散列密码相匹配。

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

正如其他人所指出的,散列并不意味着 "converted" 回到其原始值 。出于这个确切的原因,哈希在数据库中用于存储密码。使用存储在数据库中的哈希,即使我可以访问数据库,我也无法弄清楚存储在那里的密码。

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

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

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

2.
你想实现一个 login/register Service/System 将密码存储为散列。
如果这是你想要的,我会建议友好bcrypt: https://en.wikipedia.org/wiki/Bcrypt
如今,bcrypt 在某种程度上已成为散列密码和其他信息的标准。 Java 实现还提供了一种很好的方法来检查输入的密码是否与存储的密码匹配。因此,您不必为了检查密码而在几天内破解哈希。

Java bcrypt 的实现可以在这里找到:http://www.mindrot.org/projects/jBCrypt/