Как эта функция PHP должна выглядеть в Ruby? HMAC MD5

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

Код 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: 367sku000226Loremipsumdolorsitamet4112011102103HUF158CCVISAMC41010

Секретный ключ:

|! N4A8 ~ 3T8 ^ 3 [8% I 8 @ Q?

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

5142968ed89754e8d3a9b9a2469d21f2

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

1

Решение

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

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

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

5

Другие решения

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

    require 'openssl'

key = '|n4A8~!3T8^3[8%I?8@Q'

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

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

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

puts hmac # Result = 7e84e5a7ceff25a8400ecf9608aed731
0

По вопросам рекламы [email protected]