我正在尝试一个例子:
String hashAlgorithm ="sha-256"
...
md=MessageDigest.getInstance(hashAlgorithm);
byte[] enteredPasswordDigest = md.digest(policy.getPassword().getBytes());
if (!MessageDigest.isEqual(enteredPasswordDigest, realPassword.getBytes())) {
...
}
但是,散列密码作为字符串存储在数据库中。当我做那个比较时,它失败了。当我调试它时,enteredPasswordDigest
长度为32字节,realPassword.getBytes()
长度为64字节。
我错过了什么?
答案 0 :(得分:1)
简单地说,
byte[]
转换为字符串试试这个,
String hashedStr = new String(enteredPasswordDigest);
if (!hashedStr.equals(realPassword)) {
...
} else {
...
}
文档: String.getBytes()
此方法在此字符串无法编码时的行为 默认字符集未指定。
java.nio.charset.CharsetEncoder
当对编码过程有更多控制时,应该使用class 必需的。
答案 1 :(得分:0)
假设realPassword是一个String,问题可能是Java字符串是UTF16,即每个字符2个字节。尝试打印两个字节数组,以便更好地了解最新情况。
答案 2 :(得分:0)
我用这一点解决了我的问题:在数据库中作为字符串的哈希密码是“hex”。这是重点。所以我得到了输入密码的字节数组摘要的十六进制。然后我比较了具有十六进制值的字符串。