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尝试一下.