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

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

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

内容提要

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

🔎

延伸解读

编码方式的重要性

HMAC 签名的编码方式在不同编程语言中存在显著差异,尤其是 Go 和 PHP。理解这些差异对于确保数据的完整性和身份验证至关重要。开发者在实现 HMAC 签名时,需特别注意编码前的数据格式,以避免因编码不一致导致的验证失败。

避免常见错误

在使用 HMAC 签名时,开发者常常忽视编码方式的选择。PHP 的 hash_hmac 函数可以返回二进制数据或 16 进制字符串,错误的参数设置可能导致签名结果不一致。因此,建议在 PHP 中明确使用二进制结果,以确保与 Go 的输出一致。

Base64 编码的影响

Base64 编码是将二进制数据转换为文本格式的重要手段,但输入数据的不同会直接影响最终的编码结果。开发者应避免先将 HMAC 结果转换为 16 进制字符串再进行 Base64 编码,以免数据翻倍,导致编码结果不一致。

Q&A

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 进制)会导致最终输出的长度和内容不同。

🏷️

标签

➡️

继续阅读