我试图在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代码做的一切都是正确的。但为什么要打印另一个结果。我的错误在哪里?
先期
发布于 2017-07-27 10:24:13
有一个关于如何正确使用它的示例。你应该这样做:
c := sha1.New()
io.WriteString(c, "hello")
myBytes := c.Sum(nil)
fmt.Println(base64.StdEncoding.EncodeToString(myBytes))发布于 2017-07-27 10:24:08
您使用标准库的方式完全错误。不要假设方法/函数是做什么的,如果文档对您来说是新的,请始终阅读它。
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))输出与预期的相同(在围棋游乐场上尝试一下):
qvTGHdzF6KLavt4PO0gs2a6pQ00=请注意,crypto/sha1包还有一个方便的sha1.Sum()函数,它可以在一步内完成此操作:
input := []byte("hello")
sum := sha1.Sum(input)
fmt.Println(base64.StdEncoding.EncodeToString(sum[:]))输出是相同的。在围棋游乐场上试一试。
https://stackoverflow.com/questions/45347894
复制相似问题