【问题标题】:Wrong SHA-256 hash of a string in MessageDigestMessageDigest 中字符串的错误 SHA-256 哈希
【发布时间】:2015-04-24 02:28:13
【问题描述】:

在一些测试中,我在 Groovy 中使用 MessageDigest 库,有时此函数返回不正确的值。下面是我的代码:

import java.security.MessageDigest;
String.metaClass.toSHA256 = {
    def messageDigest = MessageDigest.getInstance("SHA-256")
    messageDigest.update(delegate.getBytes("UTF-8"))
    new BigInteger(1, messageDigest.digest()).toString(16).padLeft(40, '0')
}

例如 - 我尝试将此字符串编码为 SHA-256:

582015-04-23 20:47:112015-04-23 23:59:000020502015-04-23 20:47:11tests-from-api["afoot"]33facafaece3afd353bcbe88637d11b7

我的方法返回
cb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738

但是在线生成器,返回0cb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738

它在 40 次尝试中计算错误 2 次
你能帮我解决一下吗?

【问题讨论】:

  • 当 SHA-256 哈希为 64 个字符时,您正在使用 padLeft(40, '0')...
  • 不就是一样,多了一个0吗?

标签: java groovy sha256 message-digest


【解决方案1】:

您在开头缺少一个“0”,因为您向左填充到 40 个字符(可能是从哈希预计为 40 个字符的地方复制了该代码)实际构成 SHA-256 哈希的 64 个字符中的一个(以十六进制表示)。

所以您可以修复 padLeft 代码 - 但我个人会避免使用 BigInteger 进行十六进制转换。这不是它的设计目的 - 它是为大整数的数学运算而设计的。

相反,使用常用实用程序库中的 许多 十六进制转换器之一 - 专门设计用于将字节数组转换为十六进制,根本不涉及整数。如果您不想使用库,Stack Overflow 上有很多代码可以将 byte[] 转换为十六进制。

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 2011-03-07
    • 2014-08-19
    • 2011-11-02
    • 2023-03-18
    • 2014-08-29
    • 2016-07-13
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多