问题描述
因此,我已经编写了此代码以将密码转换为哈希值,现在我想将哈希值转换为字符串。 如何做到这一点?
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楼
正如其他人指出的那样, 哈希并不意味着要“转换”回其原始值 。 出于这个确切的原因,数据库中使用散列来存储密码。 使用哈希存储在数据库中,即使我有权访问该数据库,也无法弄清楚存储在该数据库中的密码。
现在,根据您对哈希的使用情况,您可以尝试多种操作:
1。
您只想让密码在一段时间后变得不可读
在这种情况下,您可以使用加密和解密算法而不是哈希方法。
这样,您可以根据需要取回原始值。
举一个简单的例子: :
切勿使用加密来存储密码。
2。
您想要实现一个将密码存储为哈希的登录/注册服务/系统。
如果这是您想要的,我建议您使用友好的bcrypt: :
如今,bcrypt在某种程度上已经成为哈希密码和其他信息的标准。
Java实现还提供了一种检查输入的密码是否与存储的密码匹配的好方法。
因此,您不必花几天时间就可以破解哈希,只需检查密码即可。
可以在以下位置找到bcrypt的Java实现: :
2楼
你可以尝试用破解它
3楼
散列密码的全部目的是实现一件事:使其尽可能难以从其散列版本中获取原始密码。
无论如何,您永远不需要该原始密码。 您只需保留哈希(加盐!)密码,每当您需要再次验证用户身份时,便要求输入用户密码,对其进行哈希处理,然后检查该密码是否与您先前存储的持久哈希密码匹配。
因此:尽管有时可以从其哈希中获取密码,但这只是您不关心的事情(除非您是想评估哈希实现质量的密码学家)。