在go中与python和openss不同吗

2024-09-22 14:28:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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代码如下所示

^{pr2}$

和输出qvTGHdzF6KLavt4PO0gs2a6pQ00=

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

echo -n hello| openssl dgst -sha1 -binary |base64

并输出这个qvTGHdzF6KLavt4PO0gs2a6pQ00=

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

提前还款


Tags: 代码importgopackagehello编码inputmain
2条回答

使用标准库的方式完全错误。不要假设一个方法/函数的作用,如果你不熟悉,一定要阅读文档。在

^{}返回^{}。它的Sum()方法是而不是来计算哈希值,但是为了得到当前的哈希结果,它不会改变底层的哈希状态。在

hash.Hash实现^{},要计算某些数据的哈希值,必须将该数据写入其中。Hash.Sum()如果已经分配了一个可选的片,那么它将结果(散列)写入其中。如果您想让它分配一个新的,请传递nil。在

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

工作示例:

c := sha1.New()
input := []byte("hello")
c.Write(input)
sum := c.Sum(nil)
fmt.Println(base64.StdEncoding.EncodeToString(sum))

输出如预期(在Go Playground上尝试):

^{pr2}$

请注意,^{}包还有一个方便的^{}函数,该函数只需一步即可完成:

^{3}$

输出相同。在Go Playground上试试。在

有一个example如何正确使用它。您应该:

c := sha1.New()
io.WriteString(c, "hello")
myBytes := c.Sum(nil)
fmt.Println(base64.StdEncoding.EncodeToString(myBytes))

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

相关问题 更多 >