在Golang中从字符串创建HMAC_256

5
我试图从一条消息和密钥中生成一个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))
}

我不确定出了什么问题,请指教。

你还没有展示给我们这段代码对应的内容。你是如何创建用于比较结果的MAC的? - Artjom B.
我刚刚手动比较了在Ruby中使用它与使用以下代码的效果:hash = OpenSSL::HMAC.hexdigest("sha256", key, message) - Sebastian J
好的,这是一个简单的hmac-sha256。为什么你在go代码中还要对“key”运行MD5?如果你想要hmac-sha256,请不要这样做。 - Artjom B.
我想在使用密钥之前对其进行哈希处理。因此,我首先通过MD5将其传递。 - Sebastian J
好的,但是这样就无法与您在评论中发布的代码结果匹配。如果使用不同的方法,为什么您期望相同的结果呢? - Artjom B.
1个回答

12

你正在打印出你的“key”的十六进制编码版本,但你正在使用未编码的原始字节作为该密钥。

在示例中,你的密钥被打印为:

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"

直接使用字符串应该能够显示差异:http://play.golang.org/p/wteqLNcnTV

打印结果为:

3f0ee534c3d86cb16f4413fe1a76a12f94449f751f7d632cd87f24b94e76c710

但是在godocs中写道,hmac.New需要一个[]byte类型的密钥?我应该传递什么? - Sebastian J
因此,它应该是:key := hex.EncodeToString(secretHash.Sum(nil)) - Sebastian J
1
@SebastianJ:是的,如果你想匹配你正在使用的 Ruby 代码所做的任何操作,那么这是一种方法。请注意,通过十六进制编码摘要,您不会获得任何熵(您只是用较小的值范围使其变长)。 - JimB
这虽然有些老旧,但对于谷歌用户来说仍然很重要。在 Go 语言中,[]byte(或 byte 类型的切片)是字符串的表示方式。因此,可以使用函数 string(slice-of-bytes-here)[]byte(string-goes-here) 来互相转换。 - Sami Fouad
@SamiFoua:类型不可互换,字符串不由字节切片表示,但它们可以进行转换,文档中有解释:https://golang.org/ref/spec#Conversions_to_and_from_a_string_type - JimB
我在谈论实际应用。将它们转换的过程是我所说的可互换性。当然,从技术上讲,Go 如何实现它们又是另一回事了。更好的例子是:https://play.golang.org/p/Jti97enncSf - Sami Fouad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接