HMAC 签名编码的坑:Go 和 PHP 的不同处理方式

HMAC 签名编码的坑:Go 和 PHP 的不同处理方式

💡 原文中文,约2600字,阅读约需7分钟。
📝

内容提要

HMAC 签名在 Go 和 PHP 中的编码方式不同,导致相同数据的签名结果不一致。PHP 默认返回 16 进制字符串,而 Go 返回二进制数据。为确保跨语言一致性,建议统一使用二进制数据编码,以避免验证失败。

🎯

关键要点

  • HMAC 签名在 Go 和 PHP 中的编码方式不同,导致相同数据的签名结果不一致。
  • PHP 默认返回 16 进制字符串,而 Go 返回二进制数据。
  • 建议统一使用二进制数据编码,以确保跨语言一致性,避免验证失败。
  • Go 和 PHP 的 HMAC 计算逻辑相同,但编码前的输入数据不同,导致结果不同。
  • PHP 的 hash_hmac 函数可以返回原始二进制数据或 16 进制字符串,取决于参数设置。
  • Base64 编码将二进制数据转换为文本格式,输入数据的不同会直接影响最终的编码结果。
  • 为了保证 HMAC 计算的一致性,建议在 PHP 中使用二进制结果,在 Go 中直接使用二进制数据进行编码。
  • 直接对 HMAC 结果进行 Base64 编码能保持原始数据格式,避免数据翻倍导致的编码结果不同。

延伸问答

HMAC 签名在 Go 和 PHP 中有什么不同?

HMAC 签名在 Go 中返回二进制数据,而 PHP 默认返回 16 进制字符串,导致相同数据的签名结果不一致。

如何确保 Go 和 PHP 中 HMAC 签名的一致性?

建议在 PHP 中使用 hash_hmac('sha1', $data, $password, true) 获取二进制结果,在 Go 中直接使用 base64.StdEncoding.EncodeToString(signatureBytes)。

为什么直接对 HMAC 结果进行 Base64 编码会导致不同的结果?

因为在 PHP 中,默认返回 16 进制字符串,转换后长度翻倍,影响最终的 Base64 编码结果。

PHP 的 hash_hmac 函数如何影响 HMAC 签名的输出?

hash_hmac 函数可以通过参数设置返回原始二进制数据或 16 进制字符串,影响最终的签名结果。

Base64 编码的主要作用是什么?

Base64 编码将二进制数据转换为文本格式,便于在 URL 或 JSON 等环境中传输。

在 HMAC 签名中,为什么输入数据的不同会影响编码结果?

输入数据的不同会直接影响编码结果,因为不同的编码方式(如二进制与 16 进制)会导致最终输出的长度和内容不同。

🏷️

标签

➡️

继续阅读