2013-04-25 21 views
0

我嘗試在Rails中創建一個HMAC並在PHP中驗證它。
Rails的外殼:Rails和PHP encode64不同意

 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); 

Rails的結果:8494f6237ee6042a3da8848db21284be17bf6ade

PHP結果:ayw4/L22fCtXPvPPGaY/Ud8yhMU =
任何幫助將是巨大的感謝!

+0

在Ruby on Rails的=>'00916893840fe0a29dfdc261efd3a26a&= 8494f6237ee6042a3da8848db21284be17bf6ade' 關於PHP =>'00916893840fe0a29dfdc261efd3a26a&= ayw4/L22fCtXPvPPGaY/Ud8yhMU = '? – Lian 2013-04-25 10:10:21

+0

我認爲hash_hmac參數的順序在php,第一個數據,然後是關鍵字。 – Dinesh 2013-04-25 10:15:55

回答

1

你有2個問題:

  1. 你的紅寶石輸出返回爲ASCII十六進制,不生了,你不Base64編碼它
  2. 你的PHP hash_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中添加一個)。

+0

非常感謝,您的意見對我有幫助。 – xeostream 2013-04-26 09:46:29

0

嘗試不同的試驗和錯誤之後,我發現了這兩個功能是如何similar..this會給你想要的resut一樣紅寶石:

$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,第一個數據,然後是關鍵字。 紅寶石輸出沒有base64編碼,所以你不必使用Base64編碼在PHP ..

+0

你說得對,參數順序不一樣,坦克你。 – xeostream 2013-04-26 09:48:35