我试图在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会打印另一个结果。 我的错误在哪里?在
提前还款
使用标准库的方式完全错误。不要假设一个方法/函数的作用,如果你不熟悉,一定要阅读文档。在
^{} 返回^{} 。它的
Sum()
方法是而不是来计算哈希值,但是为了得到当前的哈希结果,它不会改变底层的哈希状态。在hash.Hash
实现^{Hash.Sum()
如果已经分配了一个可选的片,那么它将结果(散列)写入其中。如果您想让它分配一个新的,请传递nil
。在另外,
base64.StdEncoding.EncodeToString()
需要将要转换为base64的字节数据(字节片),因此必须将校验和数据传递给它。在您的代码中,您没有告诉EncodeToString()
要编码什么。在工作示例:
输出如预期(在Go Playground上尝试):
^{pr2}$请注意,^{} 包还有一个方便的^{} 函数,该函数只需一步即可完成:
^{3}$输出相同。在Go Playground上试试。在
有一个example如何正确使用它。您应该:
https://play.golang.org/p/sELsWTcrdd
相关问题 更多 >
编程相关推荐