2

我正在尝试一个例子:

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 字节长度。

我错过了什么?

4

3 回答 3

1

简单地,

  • 获取输入的密码并对其进行哈希/消化
  • 转换byte[]为字符串
  • 将该字符串与数据库中已经散列的密码字符串进行比较

试试这个,

String hashedStr = new String(enteredPasswordDigest);
if (!hashedStr.equals(realPassword)) {
  ...
} else {
  ...
}

文件: String.getBytes()

当此字符串无法以默认字符集编码时,此方法的行为未指定。当java.nio.charset.CharsetEncoder 需要对编码过程进行更多控制时,应使用该类。

于 2012-06-08T09:37:53.733 回答
0

假设 realPassword 是一个字符串,问题可能是 Java 字符串是 UTF16,即每个字符 2 个字节。尝试打印两个字节数组以更好地了解正在发生的事情。

于 2012-06-08T09:36:12.417 回答
0

我用这一点解决了我的问题: Hashed password as a string at database is "hex"。这是重点。所以我得到了输入密码的字节数组摘要的十六进制。然后我比较了具有十六进制值的字符串。

于 2012-06-11T05:24:46.680 回答