【问题标题】:Java and Go hash value with sha256 is different [closed]带有 sha256 的 Java 和 Go 哈希值不同 [关闭]
【发布时间】:2021-02-03 01:19:30
【问题描述】:

我正在尝试为 Java 和 Go 中的相同输入生成具有相同算法 (sha256) 的哈希。有趣的是,我得到了两个值。任何解释表示赞赏,我需要在 Go 中生成 Java 中生成的相同哈希。

Java 代码:

public byte[] sha256Hash(byte[] content) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            return digest.digest(content);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e.getMessage(),e);
        }
    }
byte[] to ="AA".getBytes();
byte[] shaed = sha256Hash(to);
System.out.println(Arrays.toString(shaed));

Java 输出:[88, -69, 17, -100, 53, 81, 58, 69, 29, 36, -36, 32, -17, 14, -112, 49, -20, -123, -77、91、-4、-111、-99、38、62、126、93、-104、104、-112、-100、-75]

去:

fmt.Println(sha256.Sum256([]byte("AA")))

输出:[88 187 17 156 53 81 58 69 29 36 220 32 239 14 144 49 236 133 179 91 252 145 157 38 62 126 93 152 104 144 156 181]

【问题讨论】:

  • 不一样是什么意思?打印的十进制字节?
  • 如果你用 Java 打印一个字节数组,你不会得到任何有用的东西。你会得到[B@,后跟一个哈希码。它没有告诉你字节数组的内容,这很重要。
  • Java 的 byte 已签名,而 Go 的 byte 未签名:参见 this answer。将它们打印为十六进制值,然后它们应该匹配。
  • @khelwood 我已经使用 Arrays.tostring() 来打印我忘记发布的 java 输出。即使这样,它也不同
  • 那么这就是我怀疑的:它是this的副本。

标签: java go sha256


【解决方案1】:

您没有将字节转换为十六进制。

  import javax.xml.bind.DatatypeConverter;
 class GetHash{

public static String generateHash(String pass) throws NoSuchAlgorithmException{
    
    MessageDigest sha=MessageDigest.getInstance("SHA-256");
    
    byte[] b=sha.digest(pass.getBytes());
    
    return DatatypeConverter.printHexBinary(b);

 }}

使用 DatatypeConverter.printHexBinary(b) 方法将字节转换为十六进制字符串

或使用此链接了解更多方法 How do you convert a byte array to a hexadecimal string, and vice versa?

【讨论】:

  • 为什么你要链接一个关于 Java 和 Go 的 C# 问题?
  • 这些方法也适用于java
  • 语法不同。 Java中有一个类似的问题,你为什么不包括呢?
猜你喜欢
  • 2011-06-08
  • 2019-03-03
  • 2014-08-19
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
相关资源
最近更新 更多