MessageDigest 中字符串的 SHA-256 散列错误
Wrong SHA-256 hash of a string in MessageDigest
在某些测试中,我在 Groovy 中使用 MessageDigest 库,有时此函数 return 的值不正确。下面是我的代码:
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
我的方法return
cb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738
但是在线生成器,returns 0cb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738
它在 40 次尝试中计算错了 2 次
你能帮我解决一下吗?
您在开头缺少一个“0”,因为您要向左填充 40 个字符(大概是从哈希值预期的位置复制了该代码是 40 个字符)而不是实际构成 SHA-256 哈希(十六进制)的 64 个字符。
所以您可以 只需修复 padLeft
代码 - 但就我个人而言,我会避免使用 BigInteger
进行十六进制转换。这不是它的设计目的 - 它是为大整数的数学运算而设计的。
相反,使用常用实用程序库中的 众多 十六进制转换器之一 - 这些转换器专门设计用于将字节数组转换为十六进制,与整数无关。如果您不想使用库,Stack Overflow 上有大量代码可以将 byte[]
转换为十六进制。
在某些测试中,我在 Groovy 中使用 MessageDigest 库,有时此函数 return 的值不正确。下面是我的代码:
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
我的方法return
cb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738
但是在线生成器,returns 0cb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738
它在 40 次尝试中计算错了 2 次
你能帮我解决一下吗?
您在开头缺少一个“0”,因为您要向左填充 40 个字符(大概是从哈希值预期的位置复制了该代码是 40 个字符)而不是实际构成 SHA-256 哈希(十六进制)的 64 个字符。
所以您可以 只需修复 padLeft
代码 - 但就我个人而言,我会避免使用 BigInteger
进行十六进制转换。这不是它的设计目的 - 它是为大整数的数学运算而设计的。
相反,使用常用实用程序库中的 众多 十六进制转换器之一 - 这些转换器专门设计用于将字节数组转换为十六进制,与整数无关。如果您不想使用库,Stack Overflow 上有大量代码可以将 byte[]
转换为十六进制。