Java将SHA-256哈希字符串与密码明文字符串进行比较
我正在尝试一个例子:Java将SHA-256哈希字符串与密码明文字符串进行比较,java,bytearray,sha256,Java,Bytearray,Sha256,我正在尝试一个例子: String hashAlgorithm ="sha-256" ... md=MessageDigest.getInstance(hashAlgorithm); byte[] enteredPasswordDigest = md.digest(policy.getPassword().getBytes()); if (!MessageDigest.isEqual(enteredPasswordDigest, realPassword.getBytes())) { .
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字节的长度
我遗漏了什么?假设realPassword是一个字符串,问题可能是Java字符串是UTF16,即每个字符2个字节。尝试打印两个字节数组,以便更好地了解正在发生的事情。简单地说
- 获取输入的密码并对其进行哈希/摘要处理
- 将
转换为字符串字节[]
- 将该字符串与数据库中已散列的密码字符串进行比较
String hashedStr = new String(enteredPasswordDigest);
if (!hashedStr.equals(realPassword)) {
...
} else {
...
}
文档:String.getBytes()
当此字符串无法在中编码时,此方法的行为
默认字符集未指定。java.nio.charset.CharsetEncoder
当需要对编码过程进行更多控制时,应使用类
必需的
我用这一点解决了我的问题:作为数据库字符串的散列密码是“hex”。这是要点。所以我得到了输入密码的字节数组摘要的十六进制数。然后我比较了具有十六进制值的字符串。您确定realPassword.getBytes()的长度是64位(=8字节)而不是字节吗?因为我不知道可以创建64位输出的安全哈希函数。hashedStr的长度是32,但realPassword是64?@kamaci:
realPassword.getBytes()。长度是64,我不使用它。只需使用字符串realPassword
本身,如我的帖子所示。这个长度实际上是32。既然你已经管理了你想要的东西,你可能会考虑考虑把它腌起来以获得更好的安全性。