【问题标题】:Java compare SHA-256 hashed string with a password clear text stringJava 将 SHA-256 散列字符串与密码明文字符串进行比较
【发布时间】:2012-06-11 13:24:46
【问题描述】:

我正在尝试一个例子:

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.getBytes() 的长度是 64 位(=8 字节)而不是字节吗?因为我不知道可以创建 64 位输出的安全哈希函数。

标签: java bytearray sha256


【解决方案1】:

很简单,

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

试试这个,

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

文档: String.getBytes()

当这个字符串不能被编码时这个方法的行为 默认字符集未指定。 java.nio.charset.CharsetEncoder 当对编码过程进行更多控制时,应使用类 必填。

【讨论】:

  • hashedStr 的长度是 32 但 realPassword 是 64?
  • @kamaci:realPassword.getBytes().length 是 64,我没有使用它。只需使用字符串realPassworditself,如我的帖子所示。而那个长度确实是 32。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我用这一点解决了我的问题:在数据库中作为字符串的哈希密码是 "hex"。这是重点。所以我得到了输入密码的字节数组摘要的十六进制。然后我比较了具有十六进制值的字符串。

    【讨论】:

    • 既然您已经管理了您要查找的内容,您可能需要考虑考虑加盐以提高安全性。
    猜你喜欢
    • 2017-02-20
    • 2010-10-06
    • 2019-07-12
    • 2016-04-22
    • 1970-01-01
    • 2021-08-27
    • 2012-08-31
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多