有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

MessageDigest中字符串的java哈希错误

在一些测试中,我在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) 个答案

  1. # 1 楼答案

    您在开始时缺少了一个“0”,因为您将填充到40个字符(可能是从哈希值预计为40个字符的地方复制了该代码),而不是实际构成SHA-256哈希值(十六进制)的64个字符

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

    取而代之的是,在公共实用程序库中使用许多十六进制转换器中的一个,它们的设计目的是精确地将字节数组转换为十六进制,而与整数无关。如果您不想使用库,那么在堆栈溢出上有很多代码可以将byte[]转换为十六进制