PHP版本:
hash_hmac('sha384', data, privateKey, true);
我已经将上面的PHP代码重写为下面的ruby代码,但是没有获得类似的结果。
Ruby版本:
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha384"), privateKey, data)
PHP是原始二进制数据,Ruby没有这样的选项。
如何将PHP函数重写为Ruby函数?
答案 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方法是将值插入字符串的好方法,因为它非常清楚格式。
您当然也可以使用字节值数组,但该数组与大多数用例不兼容。
我不确定这会解决你的问题,但值得一试。