2017-07-27 37 views
4

我试图建立在旅途中base64编码的SHA1哈希值,但结果我得到不同的是其他编程语言SHA1中去比蟒蛇和OpenSSL

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代码做的一切是正确的。 但为什么去打印另一个结果。 我的错误在哪里?

日Thnx提前

回答

3

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

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

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

+0

真棒!是我的愚蠢的错误。但thnx您的快速回复。我会标记你的答案是正确的 – minzchickenflavor

10

您使用标准库在一个完全错误的方式。不要假设一种方法/功能的作用,如果它对你来说是新的,总是阅读文档。

sha1.New()返回hash.Hash。它的Sum()方法是而不是来计算散列值,但要获取当前散列结果,它不会更改基础散列状态。

hash.Hash implements 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