Java将SHA-256散列字符串与密码明文字符串进行比较

时间:2012-06-08 09:29:06

标签: java bytearray sha256

我正在尝试一个例子:

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

我错过了什么?

3 个答案:

答案 0 :(得分:1)

简单地说,

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

试试这个,

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”。这是重点。所以我得到了输入密码的字节数组摘要的十六进制。然后我比较了具有十六进制值的字符串。