Java HMAC SHA256生成bodyHash示例转Ruby实现的正确性验证
你的Ruby实现逻辑是正确的,不需要额外针对UTF-8编码做适配,原因如下:
- Java代码里指定
UTF8_ENCODING的作用是,强制把密钥、payload字符串转为字节数组时使用UTF-8编码,避免不同运行环境的默认编码不同,导致字节序列差异最终影响哈希结果。 - Ruby 2.0及之后的版本默认字符串编码就是UTF-8,你代码里常量定义的
SECRET_KEY、通过to_json生成的payload字符串默认都是UTF-8编码,OpenSSL::HMAC.digest方法处理时直接读取字符串的UTF-8字节序列,和Java的逻辑完全一致。
补充注意事项:
如果两端计算出的哈希值不一致,优先排查JSON序列化规则是否对齐:比如JSON键的排序、是否包含多余空格、特殊字符的转义规则是否相同,只要两端输入的字节序列完全一致,生成的HMAC结果就会相同。你可以直接用你示例中的测试用例在Java端运行验证,只要输出和你Ruby得到的DzWVea1hH+F3S2SuYWfyBjGCJI0bJ4393+kH1dU6LFc=一致,就说明实现完全正确。
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

