2009-08-26 19 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}"