我有一个围棋项目
package main
import (
"crypto/hmac"
"crypto/sha1"
"fmt"
)
func main() {
val := []byte("nJ1m4Cc3")
hasher := hmac.New(sha1.New, val)
fmt.Printf("%x\n", hasher.Sum(nil))
// f7c0aebfb7db2c15f1945a6b7b5286d173df894d
}
以及一个Python(2.7)程序,该程序正试图复制Go代码(使用crypto/hmac
)
import hashlib
val = u'nJ1m4Cc3'
hasher = hashlib.new("sha1", val)
print hasher.hexdigest()
# d67c1f445987c52bceb8d6475c30a8b0e9a3365d
使用hmac
模块可以得到不同的结果,但仍然与Go代码不同。你知道吗
import hmac
val = 'nJ1m4Cc3'
h = hmac.new("sha1", val)
print h.hexdigest()
# d34435851209e463deeeb40cba7b75ef
当它们在相同的输入上使用相同的哈希时,为什么要打印不同的值?你知道吗
你必须确保
在这两种情况下,输入应该是相同的二进制blob。在Python程序中,您定义了一个unicode对象,而不控制它的二进制表示。用
b
替换u
前缀,就可以了(这是在python2.7和python3中定义字节序列的显式方法)。这不是实际问题,但最好在这里明确。你知道吗问题是在Go和Python实现中应用了不同的方法。
鉴于Python是参考
在Go中,根本不需要导入
"crypto/hmac"
,在Python中,只需构建数据的SHA1散列。在围棋中,等价物是:测试和输出:
这再现了第一个Python代码段创建的内容。你知道吗
编辑:我简化了一点Go代码,使Python看起来更优雅。围棋在这里也很优雅:-)。你知道吗
既然围棋是参照物
测试输出(&O):
这将重现Go代码段创建的内容。然而,当一个人使用空消息时,我不确定HMAC的密码意义。你知道吗
相关问题 更多 >
编程相关推荐