当前位置: 代码迷 >> java >> 从SHA哈希到密码
  详细解决方案

从SHA哈希到密码

热度:94   发布时间:2023-07-25 20:00:22.0

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

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

}

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

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

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

举一个简单的例子: :
切勿使用加密来存储密码。

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

可以在以下位置找到bcrypt的Java实现: :


你可以尝试用破解它

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

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

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

  相关解决方案