sha1与go在python和openssl中的区别

min*_*vor 4 python encryption openssl sha1 go

我试图在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))
}
Run Code Online (Sandbox Code Playgroud)

此Go Code打印出来 aGVsbG/aOaPuXmtLDTJVv++VYBiQr9gHCQ==

我的Python代码看起来像这样

import hashlib
import base64


print(base64.b64encode(hashlib.sha1('hello').digest()))
Run Code Online (Sandbox Code Playgroud)

和输出 qvTGHdzF6KLavt4PO0gs2a6pQ00=

我的用于比较的bash命令看起来像这样

echo -n hello| openssl dgst -sha1 -binary |base64
Run Code Online (Sandbox Code Playgroud)

输出这个 qvTGHdzF6KLavt4PO0gs2a6pQ00=

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

Thnx提前

icz*_*cza 10

您以完全错误的方式使用标准库.不要假设方法/功能的作用,如果对您来说是新手,请务必阅读文档.

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))
Run Code Online (Sandbox Code Playgroud)

输出与预期一致(在Go Playground上尝试):

qvTGHdzF6KLavt4PO0gs2a6pQ00=
Run Code Online (Sandbox Code Playgroud)

请注意,该crypto/sha1软件包还具有一个方便的sha1.Sum()功能,可以一步完成:

input := []byte("hello")
sum := sha1.Sum(input)
fmt.Println(base64.StdEncoding.EncodeToString(sum[:]))
Run Code Online (Sandbox Code Playgroud)

输出是一样的.在Go Playground尝试一下.