首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go SHA-256散列与Java 256散列不同

Go SHA-256散列与Java 256散列不同
EN

Stack Overflow用户
提问于 2014-06-27 22:27:05
回答 2查看 2.3K关注 0票数 5

如果我在语言"GO“中生成SHA-256哈希,我会得到一个与Java等价的不同的字节数组。

这是围棋版本:

代码语言:javascript
复制
fmt.Println(getSha256([]byte("5nonce=5")))

生成的数组如下所示:

代码语言:javascript
复制
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代码中做同样的事情:

代码语言:javascript
复制
MessageDigest md = MessageDigest.getInstance("SHA-256");

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

但是结果是这个字节数组

代码语言:javascript
复制
[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版本完全相同的工作方式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-27 22:28:50

他们为什么不一样?

他们不是真的。他们是同一批人。只是Java没有无符号字节--因此,任何具有顶部位集的字节都是负的。在任何情况下,您都会看到Java结果= Go结果- 256。

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

票数 16
EN

Stack Overflow用户

发布于 2014-06-28 07:00:14

这是围棋代码将产生相同的结果:

代码语言:javascript
复制
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医生的确提到:

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

因为数值类型定义了:

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

这就是为什么您需要将byte (无签名)转换为签名的int8才能看到相同的结果。

如果添加base64编码(请参阅高朗游乐场),则可以更容易地比较结果:

代码语言:javascript
复制
import "encoding/base64"

res := base64.StdEncoding.EncodeToString([]byte(sum224[:]))
fmt.Println(res)

返回:

代码语言:javascript
复制
KU+668d7X+IQOzOhcPXAMhVCtPqzbZkS6ZQQ7ZxFo5Y=
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24461629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档