【问题标题】:How does this PHP function should look in Ruby? HMAC MD5这个 PHP 函数在 Ruby 中应该是怎样的? HMAC MD5
【发布时间】:2015-06-19 23:28:38
【问题描述】:

我正在研究支付集成,我有一个 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

【问题讨论】:

  • 你从一个简单的打印跟踪中得到了什么,它与 PHP 实现有什么不同?
  • 出了什么问题,有什么事情没有按照您的预期发生?您能否提供 PHP 代码的示例输入和预期输出?
  • 一个 MD5 散列(如您链接到的站点生成的散列)与 HMAC MD5 散列不同,您不应期望它们给出相同的结果。
  • 那么网站上的这个:用于 HMAC 变体的共享密钥?

标签: php ruby hmac payu


【解决方案1】:

没有理由编写自己的 HMAC 实现,并且有很多很多的理由不这样做。只需使用OpenSSL module 提供的安全且经过充分测试的实现:

require "openssl"

key = "key"
data = "Hello"

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

这就是你所需要的。

【讨论】:

  • 不重新发明轮子是关键,很好。
  • 我一直在尝试使用各种 Digest 和 HMAC 选项。我会试一试。谢谢。
【解决方案2】:

毕竟我又试了一次,看来 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2014-12-28
    • 2011-04-27
    相关资源
    最近更新 更多