MessageDigest中字符串的SHA-256哈希错误

时间:2015-04-23 18:21:51

标签: java groovy sha256 message-digest

在某些测试中,我在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次 你能帮我解决一下吗?

1 个答案:

答案 0 :(得分:1)

你在开始时错过了一个'0',因为你正在填充 40 个字符(可能是从那些哈希值预计是40个字符的东西中复制了代码)实际上构成SHA-256哈希值的64个字符(十六进制)。

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

相反,在常用的实用程序库中使用其中一个很多十六进制转换器 - 这些转换器的设计精确是为了将字节数组转换为十六进制,而根本不需要整数。如果您不想使用库,则Stack Overflow上有大量代码可将byte[]转换为十六进制。