将PHP SHA1转换为Ruby

将PHP SHA1转换为Ruby,php,ruby,sha1,Php,Ruby,Sha1,我在PHP中有这样的算法: $encoded_key = 'WHllcnRGYTY3eWpUNjQ'; $decoded_key = base64_decode($encoded_key); // XyertFa67yjT64 $params_string = implode('', $params); //U215250.00121715620http://partner.domain.ru/order/U215/successhttp://partner.domain.ru/orde

我在PHP中有这样的算法:

$encoded_key = 'WHllcnRGYTY3eWpUNjQ'; 
$decoded_key = base64_decode($encoded_key); 
// XyertFa67yjT64 
$params_string = implode('', $params); 
//U215250.00121715620http://partner.domain.ru/order/U215/successhttp://partner.domain.ru/order/U215/fail 
$raw_signature = hash_hmac('sha1', $params_string, $decoded_key, true); 
// Byte-encoded, hex: c6881d8665afbb46a93a16b34bd152878a19ab3a 

$encoded_signature = base64_encode($raw_signature); 
// xogdhmWvu0apOhazS9FSh4oZqzo= 

我试图将这段代码移植到Ruby并得到相同的结果,但是Base64和OpenSSL帮不了我。有人知道怎么回事吗?

一个问题是您使用的是
HMAC.hexdigest
而不是
HMAC.digest
。您的PHP代码正在生成一个原始HMAC,然后在Base64中对其进行编码。因此,您需要在Ruby中做同样的事情

另一个问题是密钥的base64解码步骤。您输入的密钥没有正确填充,因此将被Ruby的Base64库截断。例如:

encoded_key = "WHllcnRGYTY3eWpUNjQ"

Base64.decode64(encoded_key)
#=> "XyertFa67yjT"
# incomplete!

Base64.decode64("#{encoded_key}=\n")
#=> "XyertFa67yjT64"
# this is what you actually want
填充和最后的换行符用于确保base64编码的数据是完整的,因为它标志着结束。但是,可以手动添加填充,并假设数据已完成:

require 'base64'
require 'openssl'

def base64_pad(unpadded_str)
  padding = case unpadded_str.size % 3
    when 1 then "=="
    when 2 then "="
  end
  "#{unpadded_str}#{padding}\n"
end

encoded_key = "WHllcnRGYTY3eWpUNjQ"
key = Base64.decode64(base64_pad(encoded_key))
#=> "XyertFa67yjT64"

string = "U215250.00121715620http://partner.domain.ru/order/U215/successhttp://partner.domain.ru/order/U215/fail"

Base64.encode64(OpenSSL::HMAC.digest('SHA1', key, string))
#=> "xogdhmWvu0apOhazS9FSh4oZqzo=\n"

请向我们展示您迄今为止所做的尝试。按照php指令中的所有操作,从
decode64
Base64开始。decode64(“whllcnrgyty3ewpunqq”)
给了我XyertFa67yjT-第一件奇怪的事情。。不是phpB中的XyertFa67yjT64,但即使我将XyertFa67yjT64作为键和$params_字符串,并将其与
OpenSSL::HMAC.hexdigest('SHA1',键,字符串)
一起使用,结果将是c3353924557f97d80fd53f9063f186b1e4d8df3c@rossman,谢谢您提供的补充信息。不过,它确实属于这个问题——请单击“编辑”并将其他信息添加到问题中好吗?回答得真棒,谢谢!事实上,我已经找到了答案并创建了有效的代码,但现在对我来说,这一切更加清楚了。我认为凯伊的例子有点不正确。我错过了《文摘》的那一刻。。悲哀的