OpenSSL::HMAC.hexdigest PHP 等效物不会打印与 ruby 相同的结果

这是一个我需要转换为PHP的Ruby代码:


print OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha1"), 'hello', Base64.encode64('bonjour'))

输出:


62ac34e5d28563d6a50272d660805d1f8c791e41


这是我的PHP代码:


echo hash_hmac('sha1', base64_encode('bonjour'), 'hello');

输出:


89ebf8bd3d92bf3283aa4c5f24072820258367e4


我找不到一种方法来拥有.62ac34...

我也试过:


echo hash_hmac('sha1', 'bonjour', 'hello'); // 1

echo hash_hmac('sha1', 'hello', 'bonjour'); // 2

echo hash_hmac('sha1', base64_encode('hello'), 'bonjour'); // 3

echo hash_hmac('sha1', 'hello', base64_encode('bonjour')); // 4

echo base64_encode(hash_hmac('sha1', 'hello', 'bonjour', TRUE)); //5

这也是错误的。输出:


bed443484cc49c41c053a11dd15e44d4f79c524f // 1

16923f8d6e9afd345cf947fc963cad73aa12b76c // 2

8e5989976296c76f0462fe33c6bc2dec48bdcb5a // 3

ca237e79f77e6d9739db45fc5d162da3a4036639 // 4

FpI/jW6a/TRc+Uf8ljytc6oSt2w= // 5

我完全绝望了。


肥皂起泡泡
浏览 210回答 1
1回答

收到一只叮咚

Ruby似乎正在向base64编码字符串添加换行符,而PHP则没有。红宝石:Base64.encode64('bonjour')=> "Ym9uam91cg==\n"菲律宾比索:base64_encode('bonjour')=> "Ym9uam91cg=="所以现在我们知道如何在PHP中修复它:hash_hmac('sha1', base64_encode('bonjour') . "\n", 'hello');=> "62ac34e5d28563d6a50272d660805d1f8c791e41"或者用 Ruby 修复它:OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha1"),                         'hello', Base64.encode64('bonjour').chomp)=> "89ebf8bd3d92bf3283aa4c5f24072820258367e4"第 2 部分在 PHP 和 Ruby 中,它与 .第一个生成两个字符(后跟 ),第二个生成换行符。'\n'"\n"\n因此,要修复代码,您需要在字符串中使用换行符,而不是斜杠+ n:$base64 = chunk_split(base64_encode($json), 60, "\n");                                                ^^^^您还可以使用 从 Ruby base64 编码字符串中去除换行符,这意味着您不需要在 PHP 代码中使用任何技巧:gsubencoded_body = Base64.encode64(json_body).gsub("\n", '')
打开App,查看更多内容
随时随地看视频慕课网APP