2015-04-14 2 views
0

Я работаю над интеграцией платежей, и у меня есть пример кода на PHP и попытка заставить его работать в Ruby. Пока что с небольшим успехом. Может ли кто-нибудь проверить мою реализацию и исправить, если я что-то делаю неправильно? Благодарю.Как эта функция PHP должна выглядеть в Ruby? HMAC MD5

PHP код:

/* 
* HMAC HASH creation 
* RFC 2104 
* 
http://www.ietf.org/rfc/rfc2104.txt 
* 
* @param string $key Secret key for encryption 
* @param string $data String to encode 
*/ 
function hmac($key, $data) { 
$b = 64; // byte length for md5 

if (strlen($key) > $b) { 
    $key = pack("H*", md5($key)); 
} 

$key = str_pad($key, $b, chr(0x00)); 
$ipad = str_pad('', $b, chr(0x36)); 
$opad = str_pad('', $b, chr(0x5c)); 
$k_ipad = $key^$ipad; 
$k_opad = $key^$opad; 

return md5($k_opad . pack("H*", md5($k_ipad . $data))); 
} 

И мой код Ruby:

#Calculate HMAC MD5 PayU hash for order. 
    def hmac_calculation(key, data) 
     b = 64 

     if key.length > b 
     key = Digest::MD5.hexdigest(key) 
     key = key.pack("H*") 
     end 

     key = key.ljust(b, 0x00.chr) 
     ipad = ''.ljust(b, 0x36.chr) 
     opad = ''.ljust(b, 0x5c.chr) 

     k_ipad = key^ipad 
     k_opad = key^opad 

     return Digest::MD5.hexdigest(k_opad + Digest::MD5.hexdigest(k_ipad + data).pack('H*'))  

    end 

- ОБНОВЛЕНО -

Исходная строка:

7P0499016123456192013-07-08 10 : 50: 367sku000226Loremipsumdolorsitamet4112011102103HUF158 CCVISAMC41010

Секретный ключ!?

| n4A8 ~ 3T8^3 [8% I 8 @ Q

Ожидаемый результат:

5142968ed89754e8d3a9b9a2469d21f2

Я также получил этот сайт как контрольная точка, однако приведенный выше пример не соответствует этому. http://hash.online-convert.com/md5-generator

+0

Что вы получаете от простой трассировки печати, где она отличается от реализации PHP? – gernberg

+0

Что случилось, что не происходит так, как вы ожидаете? Можете ли вы представить пример ввода и ожидаемого вывода из кода PHP? – jrochkind

+0

Я обновил его. – szabcsee

ответ

4

Нет причин писать собственную реализацию HMAC и многие, многие причины этого не делать. Просто используйте безопасный и хорошо проверенную реализацию поставляемого в OpenSSL gem:

require "openssl" 

key = "key" 
data = "Hello" 

digest = OpenSSL::Digest.new('md5') 
hmac = OpenSSL::HMAC.hexdigest(digest, key, data) 

Это буквально все, что вам нужно.

+0

Не заново изобретать колесо здесь, хорошо. – tadman

+0

Я пробовал это с помощью различных опций Digest и HMAC. Я дам ему попробовать. Благодарю. – szabcsee

0

В конце концов, я попробовал это снова, и кажется, что первоначальное требование от PayU было неправильным. Просто решение не соответствовало ожидаемому результату.

require 'openssl' 

    key = '|n4A8~!3T8^3[8%[email protected]' 

    string = '7P0499016123456192013-07-08 10:50:367sku000226Loremipsumdolorsitamet4112011102103HUF158CCVISAMC41010' 

    digest = OpenSSL::Digest.new('md5') 

    hmac = OpenSSL::HMAC.hexdigest(digest, key, string) 

    puts hmaC# Result = 7e84e5a7ceff25a8400ecf9608aed731 
Смежные вопросы