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。既然你已经管理了你想要的东西,你可能会考虑考虑把它腌起来以获得更好的安全性。