从Golang中的字符串创建HMAC_256

从Golang中的字符串创建HMAC_256,go,cryptography,hmac,Go,Cryptography,Hmac,我正在尝试从消息和密码生成HMAC 256哈希。然而,当我返回它时,它是不正确的 func makeSig(s Signature) string { secretHash := md5.New() secretHash.Write([]byte("secret")) key := secretHash.Sum(nil) fmt.Println("The secret key is ", hex.EncodeToString(key)) message

我正在尝试从消息和密码生成HMAC 256哈希。然而,当我返回它时,它是不正确的

func makeSig(s Signature) string {
    secretHash := md5.New()
    secretHash.Write([]byte("secret"))
    key := secretHash.Sum(nil)
    fmt.Println("The secret key is ", hex.EncodeToString(key))

    message := strings.Join([]string{"one", "two", "three"}, "")
    fmt.Println("The message is ", message)

    sig := hmac.New(sha256.New, key)
    sig.Write([]byte(message))
    return hex.EncodeToString(sig.Sum(nil))
}

我不确定出了什么问题,请告知。

您正在打印十六进制编码版本的“密钥”,但您使用的是该密钥的原始未编码字节

示例中的密钥打印为:

5ebe2294ecd0e0f08eab7690d2a6ee69
但你要把这个交给hmac:

[]byte{0x5e, 0xbe, 0x22, 0x94, 0xec, 0xd0, 0xe0, 0xf0, 0x8e, 0xab, 0x76, 0x90, 0xd2, 0xa6, 0xee, 0x69}
它作为一个字符串,看起来像:

"^\xbe"\x94\xec\xd0\xe0\xf0\x8e\xabv\x90\xd2\xa6\xeei"
直接使用字符串应显示差异:

哪张照片

3f0ee534c3d86cb16f4413fe1a76a12f94449f751f7d632cd87f24b94e76c710

您尚未向我们展示此代码必须对应的内容。您是如何创建并比较结果的MAC的?我刚刚手动将其与ruby中的使用进行了比较:
hash=OpenSSL::HMAC.hexdigest(“sha256”,key,message)
OK,这是一个简单的HMAC-sha256。为什么还要在go代码中的“键”上运行MD5?如果你想要hmac-sha256,就不要这样做。我想在把秘密用作密钥之前先把它散列出来。所以我先通过MD5.OK,但它与您在评论中发布的代码的结果不匹配。如果使用不同的方法,为什么期望得到相同的结果?但在文章中,它说hmac.New使用[]字节键?我应该传递什么?所以它应该是:
key:=hex.EncodeToString(secretHash.Sum(nil))
@SebastianJ:是的,如果你想匹配你正在使用的ruby代码,这是一种方法。请注意,对摘要进行十六进制编码并没有获得任何熵(只是用较小的值范围使其变长),这是一个古老的概念,但对于谷歌来说,这是一个重要的概念。。在Go中,[]字节(或字节类型的一个片段)是字符串的表示方式。因此,使用函数
string(此处为字节片)
[]byte(此处为字符串)
@SamiFoua,它们是可互换的:类型是不可互换的,字符串不是由字节片表示的,但它们可以转换,这在这里的文档中有解释