这个 PHP 函数在 Ruby 中应该如何看待? HMAC MD5
How does this PHP function should look in 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
没有理由编写自己的 HMAC 实现,还有很多很多理由不这样做。只需使用 OpenSSL module:
提供的安全且经过良好测试的实现
require "openssl"
key = "key"
data = "Hello"
digest = OpenSSL::Digest.new('md5')
hmac = OpenSSL::HMAC.hexdigest(digest, key, data)
这就是您真正需要的。
毕竟我又试了一遍,看来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
我正在处理支付集成,我在 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
没有理由编写自己的 HMAC 实现,还有很多很多理由不这样做。只需使用 OpenSSL module:
提供的安全且经过良好测试的实现require "openssl"
key = "key"
data = "Hello"
digest = OpenSSL::Digest.new('md5')
hmac = OpenSSL::HMAC.hexdigest(digest, key, data)
这就是您真正需要的。
毕竟我又试了一遍,看来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