首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sha1在go中不同于python和openssl

sha1在go中不同于python和openssl
EN

Stack Overflow用户
提问于 2017-07-27 10:18:10
回答 2查看 1.4K关注 0票数 4

我试图在go中构建一个base64编码的sha1哈希,但是我得到的结果与其他编程语言的结果非常不同。

代码语言:javascript
复制
package main

import (
    "crypto/sha1"
    "encoding/base64"
    "fmt"
)

func main() {
    c := sha1.New()
  input := []byte("hello")
  myBytes := c.Sum(input)
  fmt.Println(base64.StdEncoding.EncodeToString(base64.StdPadding))
}

这个Go代码打印出aGVsbG/aOaPuXmtLDTJVv++VYBiQr9gHCQ==

我的Python代码如下所示

代码语言:javascript
复制
import hashlib
import base64


print(base64.b64encode(hashlib.sha1('hello').digest()))

和输出qvTGHdzF6KLavt4PO0gs2a6pQ00=

用于比较的bash命令如下所示

代码语言:javascript
复制
echo -n hello| openssl dgst -sha1 -binary |base64

并输出此qvTGHdzF6KLavt4PO0gs2a6pQ00=

这让我假设python代码做的一切都是正确的。但为什么要打印另一个结果。我的错误在哪里?

先期

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-27 10:24:13

有一个关于如何正确使用它的示例。你应该这样做:

代码语言:javascript
复制
c := sha1.New()
io.WriteString(c, "hello")
myBytes := c.Sum(nil)
fmt.Println(base64.StdEncoding.EncodeToString(myBytes))

https://play.golang.org/p/sELsWTcrdd

票数 3
EN

Stack Overflow用户

发布于 2017-07-27 10:24:08

您使用标准库的方式完全错误。不要假设方法/函数是做什么的,如果文档对您来说是新的,请始终阅读它。

sha1.New()返回一个hash.Hash。它的Sum()方法是而不是来计算哈希值,但是要获得当前的哈希结果,它不会更改基础哈希状态。

hash.Hash实现了io.Writer,为了计算某些数据的散列,您必须将数据写入其中。如果已经分配了一个Hash.Sum(),则接受一个可选的切片,以便将结果(哈希)写入其中。如果您希望nil分配一个新的,请传递它。

此外,base64.StdEncoding.EncodeToString()需要要转换为base64的字节数据(字节片),因此必须将校验和数据传递给它。在您的代码中,您没有告诉EncodeToString()要编码什么。

工作实例:

代码语言:javascript
复制
c := sha1.New()
input := []byte("hello")
c.Write(input)
sum := c.Sum(nil)
fmt.Println(base64.StdEncoding.EncodeToString(sum))

输出与预期的相同(在围棋游乐场上尝试一下):

代码语言:javascript
复制
qvTGHdzF6KLavt4PO0gs2a6pQ00=

请注意,crypto/sha1包还有一个方便的sha1.Sum()函数,它可以在一步内完成此操作:

代码语言:javascript
复制
input := []byte("hello")
sum := sha1.Sum(input)
fmt.Println(base64.StdEncoding.EncodeToString(sum[:]))

输出是相同的。在围棋游乐场上试一试。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45347894

复制
相关文章

相似问题

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