【问题标题】:Go SHA-256 hash differs from Java SHA-256 hashGo SHA-256 哈希与 Java SHA-256 哈希不同
【发布时间】:2014-08-19 03:25:16
【问题描述】:

如果我以“GO”语言生成 SHA-256 哈希,与 Java 等效项相比,我会得到一个不同的字节数组。

这是 GO 版本:

fmt.Println(getSha256([]byte("5nonce=5")))

生成的数组如下所示:

41 79 186 235 199 123 95 226 16 59 51 161 112 245 192 50 21 66 180 250 179 109 153 18 233 148 16 237 156 69 163 150]

这个应该在 Java 代码中做同样的事情:

MessageDigest md = MessageDigest.getInstance("SHA-256");

md.update("5nonce=5".getBytes()); 
byte[] digest = md.digest();

但结果是这个字节数组

[41, 79, -70, -21, -57, 123, 95, -30, 16, 59, 51, -95, 112, -11, -64, 50, 21, 66, -76, -6, -77, 109, -103, 18, -23, -108, 16, -19, -100, 69, -93, -106]

为什么它们不同?我需要如何更改 java 版本才能像 Go 版本一样工作?

【问题讨论】:

    标签: java hash go sha


    【解决方案1】:

    它们为什么不同?

    他们不是,真的。它们是相同的位。只是Java没有无符号字节——所以任何设置了最高位的字节都是负数。在每种情况下,您都会看到 Java 结果 = Go 结果 - 256。

    如果您将两个字节数组都转换为十六进制或 base64,您将看到相同的结果。

    【讨论】:

    • 谢谢,将它们转换为 base64 可以更轻松地比较它们,并且它们实际上是相同的。
    【解决方案2】:

    Here is the Go code 会产生相同的结果:

    package main
    
    import "fmt"
    import "crypto/sha256"
    
    func main() {
        sum224 := sha256.Sum256([]byte("5nonce=5"))
        s := make([]int8, sha256.Size)
        for i := range sum224 {
            s[i] = int8(sum224[i])
        }
        fmt.Printf("%d", s)
    }
    
    [41 79 -70 -21 -57 123 95 -30 16 59 51 -95 112 -11 -64 50 21 66 -76 -6 -77 109 -103 18 -23 -108 16 -19 -100 69 -93 -106]
    

    fmt doc 确实提到:

    没有“u”标志。如果整数具有无符号类型,则打印无符号整数。

    由于Numeric Types 定义:

    • byte uint8 的别名
    • uint8 所有无符号 8 位整数(0 到 255)的集合
    • int8 所有有符号 8 位整数(-128 到 127)的集合

    这就是为什么您需要将 byte(未签名)转换为已签名的 int8 才能看到相同的内容。


    如果添加 base64 编码(参见golang playground),您可以获得更容易比较的结果:

    import "encoding/base64"
    
    res := base64.StdEncoding.EncodeToString([]byte(sum224[:]))
    fmt.Println(res)
    

    返回:

    KU+668d7X+IQOzOhcPXAMhVCtPqzbZkS6ZQQ7ZxFo5Y=
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2021-11-25
      • 2017-09-20
      • 2020-04-16
      • 2011-03-07
      相关资源
      最近更新 更多