0

我正在尝试在 Rails 中创建一个 HMAC 并在 PHP 中验证它。
导轨外壳:

       pry(main)>appsecret = '00916893840fe0a29dfdc261efd3a26a&'           
       pry(main)>OpenSSL::HMAC.hexdigest('sha1', appsecret, 'GET&http%3A%2F%2Fopen.tianya.cn%2Foauth%2Frequest_token.php&oauth_consumer_key%3Dfc69b18eb12bab1e9b35d1093c4de9290516cfdc4%26oauth_nonce%3Dc09e4bf167fbc7eb374b1abb02b5268d%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1366882036%26oauth_version%3D1.0')
       => "8494f6237ee6042a3da8848db21284be17bf6ade"

PHP:

      $appsecret = '00916893840fe0a29dfdc261efd3a26a&';
      $signature = base64_encode(hash_hmac('sha1', $appsecret, 'GET&http%3A%2F%2Fopen.tianya.cn%2Foauth%2Frequest_token.php&oauth_consumer_key%3Dfc69b18eb12bab1e9b35d1093c4de9290516cfdc4%26oauth_nonce%3Dc09e4bf167fbc7eb374b1abb02b5268d%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1366882036%26oauth_version%3D1.0',true));
      var_dump($signature);

导轨结果:8494f6237ee6042a3da8848db21284be17bf6ade

PHP 结果:ayw4/L22fCtXPvPPGaY/Ud8yhMU=
任何帮助将不胜感激!

4

2 回答 2

1

你有2个问题:

  1. 您的 ruby​​ 输出作为 ascii hex 返回,而不是原始的,并且您没有对其进行 base64 编码
  2. 您的 PHPhash_hmac()函数的参数顺序错误。

红宝石:

appsecret = '00916893840fe0a29dfdc261efd3a26a&'
data = 'GET&http%3A%2F%2Fopen.tianya.cn%2Foauth%2Frequest_token.php&oauth_consumer_key%3Dfc69b18eb12bab1e9b35d1093c4de9290516cfdc4%26oauth_nonce%3Dc09e4bf167fbc7eb374b1abb02b5268d%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1366882036%26oauth_version%3D1.0'

digest = OpenSSL::HMAC.digest('sha1', appsecret, data)
Base64.encode64(digest)

PHP:

$appsecret = '00916893840fe0a29dfdc261efd3a26a&';
$data = 'GET&http%3A%2F%2Fopen.tianya.cn%2Foauth%2Frequest_token.php&oauth_consumer_key%3Dfc69b18eb12bab1e9b35d1093c4de9290516cfdc4%26oauth_nonce%3Dc09e4bf167fbc7eb374b1abb02b5268d%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1366882036%26oauth_version%3D1.0';

$digest = hash_hmac('sha1', $data, $appsecret, true);
echo base64_encode($digest);

两者都产生hJT2I37mBCo9qISNshKEvhe/at4=。但是请注意,ruby 输出也有一个尾随换行符,因此如果您想直接比较它们,则需要对其进行规范化(在 ruby​​ 中将其删除或在 PHP 中添加一个)。

于 2013-04-25T10:18:23.657 回答
0

在尝试了不同的试验和错误之后,我发现这两个功能是如何相似的......这将为您提供与 ruby​​ 相同的所需结果:

$appsecret = '00916893840fe0a29dfdc261efd3a26a&';
$signature = hash_hmac('sha1', 'GET&http%3A%2F%2Fopen.tianya.cn%2Foauth%2Frequest_token.php&oauth_consumer_key%3Dfc69b18eb12bab1e9b35d1093c4de9290516cfdc4%26oauth_nonce%3Dc09e4bf167fbc7eb374b1abb02b5268d%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1366882036%26oauth_version%3D1.0',$appsecret);
var_dump($signature);

结果:

string(40) "8494f6237ee6042a3da8848db21284be17bf6ade" 

在 PHP 中 hash_hmac 的参数顺序在 php 中倒置,首先是数据,然后是键。ruby 输出不是 base64 编码的,因此您不必在 PHP 中进行 base64 编码。

于 2013-04-25T10:35:32.883 回答