【问题标题】:sha1 different in go than in python and opensslgo中的sha1与python和openssl不同
【发布时间】:2018-01-03 00:17:47
【问题描述】:

我正在尝试在 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 代码如下所示

import hashlib
import base64


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

并输出qvTGHdzF6KLavt4PO0gs2a6pQ00=

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

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

并输出这个qvTGHdzF6KLavt4PO0gs2a6pQ00=

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

提前谢谢

【问题讨论】:

    标签: python encryption go openssl sha1


    【解决方案1】:

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

    sha1.New() 返回一个hash.Hash。它的Sum()方法不是计算哈希值,而是获取当前哈希结果,并不会改变底层哈希状态。

    hash.Hash 实现了io.Writer,为了计算一些数据的哈希值,你必须将这些数据写入其中。 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 上尝试):

    qvTGHdzF6KLavt4PO0gs2a6pQ00=
    

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

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

    输出是一样的。在Go Playground 上试试吧。

    【讨论】:

      【解决方案2】:

      有一个example 说明如何正确使用它。你应该这样做:

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

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

      【讨论】:

      • 太棒了!是的,我的愚蠢错误。但是谢谢您的快速回复。我会把你的答案标记为正确
      猜你喜欢
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多