sha1与go在python和openssl中的区别

时间:2017-07-27 10:18:10

标签: python encryption go openssl sha1

我正在尝试在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 Code打印出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提前

2 个答案:

答案 0 :(得分:10)

您以完全错误的方式使用标准库。不要假设方法/功能的作用,如果对您不熟悉,请务必阅读文档。

sha1.New()返回hash.Hash。其Sum()方法来计算哈希值,但要获取当前哈希值,它不会更改基础哈希状态。

hash.Hash实现io.Writer,并且要计算某些数据的哈希值,您必须将该数据写入其中。 Hash.Sum()如果已经分配了一个可选切片,则将结果(散列)写入其中。如果您希望分配新的nil,请通过base64.StdEncoding.EncodeToString()

同样EncodeToString()期望您要转换为base64的字节数据(字节片),因此您必须将校验和数据传递给它。在您的代码中,您没有告诉c := sha1.New() input := []byte("hello") c.Write(input) sum := c.Sum(nil) fmt.Println(base64.StdEncoding.EncodeToString(sum)) 要编码的内容。

工作示例:

qvTGHdzF6KLavt4PO0gs2a6pQ00=

输出符合预期(在Go Playground上尝试):

input := []byte("hello")
sum := sha1.Sum(input)
fmt.Println(base64.StdEncoding.EncodeToString(sum[:]))

请注意,crypto/sha1包还有一个方便的sha1.Sum()功能,只需一步即可完成此操作:

  [Illuminate\Database\QueryException]                                         
 SQLSTATE[HY000]: General error: 1215 Cannot add foreign key 
constraint (SQL  
 : alter table `user_class` add constraint 
`user_class_class_id_foreign` 
foreign key (`class_id`) references `classes` (`id`))                           




[PDOException]                                                          
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key 
constraint  

输出是一样的。在Go Playground上尝试。

答案 1 :(得分:3)

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

update table t1
set B = (select nvl(max(b),sequence_name.nextval) from table where a=t1.a)

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