2009-08-26 24 views
12

我想在Ruby中創建一個HMAC,然後在PHP中驗證它。紅寶石和PHP HMACs不同意

紅寶石:

require 'openssl' 
message = "A522EBF2-5083-484D-99D9-AA97CE49FC6C,1234567890,/api/comic/aWh62,GET" 
key  = "3D2143BD-6F86-449F-992C-65ADC97B968B" 
hash = OpenSSL::HMAC.hexdigest('sha256', message, key) 
p hash 

PHP:

<?php 
    $message = "A522EBF2-5083-484D-99D9-AA97CE49FC6C,1234567890,/api/comic/aWh62,GET"; 
    $key  = "3D2143BD-6F86-449F-992C-65ADC97B968B"; 
    $hash = hash_hmac("sha256", $message, $key); 
    var_dump($hash); 
?> 

對於紅寶石,我得到:20e3f261b762e8371decdf6f42a5892b530254e666508e885c708c5b0bfc03d3

對於PHP,我得到:e5f6995ba1496b2fb144329b2d1b3b23c8fa3211486e57bfaec5d993a1da9d15

我和一些同事一個在完全失去,任何幫助將不勝感激。

+0

我懷疑字符串編碼不同。 – 2009-08-26 19:44:57

回答

29

ruby​​'s OpenSSL::HMAC.hexdigest預計第一個key,然後message

irb(main):002:0> OpenSSL::HMAC.hexdigest('sha256','3D2143BD-6F86-449F-992C-65ADC97B968B','A522EBF2-5083-484D-99D9-AA97CE49FC6C,1234567890,/api/comic/aWh62,GET') 
=> "e5f6995ba1496b2fb144329b2d1b3b23c8fa3211486e57bfaec5d993a1da9d15" 
+2

嗯,我會被詛咒的。謝謝:) – 2009-08-26 21:14:29

0

我注意到,

hash = HMAC::SHA256(key) 
hash << a 
hash << b 
hash << c 

給出不同的結果比PHP的

hash_hmac('sha256',$a.$b.$c, $key) 

提防這個警告的。要得到正確的,只是做

hash = HMAC::SHA256(key) 
hash << "#{a}#{b}#{c}"