如何用Go语言cryptohmac包在Golang中高效实现HMAC消息认证码签名与验证?

2026-04-30 13:131阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计841个文字,预计阅读时间需要4分钟。

如何用Go语言crypto/hmac包在Golang中高效实现HMAC消息认证码签名与验证?

`Go` 的 `hmac.New` 函数的第二个参数是密钥字节数组,第一个参数必须是哈希函数构造器,而不是哈希函数实例。常见错误是将 `sha256.New()`(正确)与 `sha256.Sum256({})`(错误)或 `sha256.New().Sum(nil)`(错误)混淆。错误使用会导致 panic 或编译失败。

  • hmac.New(sha256.New, key) ✅ 正确:传的是函数指针 func() hash.Hash
  • hmac.New(sha256.New(), key) ❌ 编译报错:cannot use sha256.New() (value of type hash.Hash) as func() hash.Hash value
  • SHA-512、SHA-3 等同理,必须用 sha512.New(无括号),而非 sha512.New()

验证签名必须用 hmac.Equal,别用 ==bytes.Equal

直接用 == 比较两个 []byte HMAC 值会触发时序攻击风险——攻击者可通过毫秒级响应时间差异逐字节猜出合法签名。Go 标准库的 hmac.Equal 是常量时间比较,从 Go 1.3 起内置,但容易被忽略。

阅读全文

本文共计841个文字,预计阅读时间需要4分钟。

如何用Go语言crypto/hmac包在Golang中高效实现HMAC消息认证码签名与验证?

`Go` 的 `hmac.New` 函数的第二个参数是密钥字节数组,第一个参数必须是哈希函数构造器,而不是哈希函数实例。常见错误是将 `sha256.New()`(正确)与 `sha256.Sum256({})`(错误)或 `sha256.New().Sum(nil)`(错误)混淆。错误使用会导致 panic 或编译失败。

  • hmac.New(sha256.New, key) ✅ 正确:传的是函数指针 func() hash.Hash
  • hmac.New(sha256.New(), key) ❌ 编译报错:cannot use sha256.New() (value of type hash.Hash) as func() hash.Hash value
  • SHA-512、SHA-3 等同理,必须用 sha512.New(无括号),而非 sha512.New()

验证签名必须用 hmac.Equal,别用 ==bytes.Equal

直接用 == 比较两个 []byte HMAC 值会触发时序攻击风险——攻击者可通过毫秒级响应时间差异逐字节猜出合法签名。Go 标准库的 hmac.Equal 是常量时间比较,从 Go 1.3 起内置,但容易被忽略。

阅读全文