转换哈希甚至ruby像php' s hash_hmac()

时间:2018-01-22 08:33:49

标签: php ruby hash hmac

PHP版本:

hash_hmac('sha384', data, privateKey, true);

我已经将上面的PHP代码重写为下面的ruby代码,但是没有获得类似的结果。

Ruby版本:

OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha384"), privateKey, data)

PHP是原始二进制数据,Ruby没有这样的选项。

如何将PHP函数重写为Ruby函数?

1 个答案:

答案 0 :(得分:0)

[编辑:自从第一次写作以来,我已经对这个答案进行了大量编辑,以使其更加清晰,并强调使用Array#pack。]

不幸的是,在Ruby中表达原始字节的方法是使用字符串。您应该强制编码为ASCII 8位,而不是默认的UTF-8,因此字符与字节相同,并且不会对输入数据进行任何奇特的转换。

您可以显式设置字符串的编码:

2.5.0 :008 > my_string = String.new.force_encoding(Encoding::ASCII_8BIT)
 => ""
2.5.0 :009 > my_string.encoding
 => #<Encoding:ASCII-8BIT>

...或使用Array#pack方法:

2.5.0 :010 > a123 = [1,2,3].pack('c*')
 => "\x01\x02\x03"
2.5.0 :011 > a123.encoding
 => #<Encoding:ASCII-8BIT>

......或其任何组合:

2.5.0 :018 > my_string = String.new.force_encoding(Encoding::ASCII_8BIT)
 => ""
2.5.0 :019 > my_string << [4,5,6].pack('c*')
 => "\x04\x05\x06"
2.5.0 :020 > my_string << [7,8,9].pack('c*')
 => "\x04\x05\x06\a\b\t"
2.5.0 :021 > my_string.bytes
 => [4, 5, 6, 7, 8, 9]

pack方法是将值插入字符串的好方法,因为它非常清楚格式。

您当然也可以使用字节值数组,但该数组与大多数用例不兼容。

我不确定这会解决你的问题,但值得一试。