加上登录Base64.encode64输出?

时间:2014-03-01 00:14:59

标签: python ruby

我正在使用Base64.encode64从API请求中使用的HMAC创建哈希(我没有开发的API)。生成的哈希有时包含“+”。包含“+”的请求失败。请求没有成功。

例如,Python中的相同类型的脚本在Base64编码的哈希中从不会有“+”。

以下是两个片段。同样,Python从来没有“+”,Ruby有时会这样做。

任何想法是怎么回事?如何保持Ruby的base64编码不使用“+”字符?

红宝石:

hmac = OpenSSL::HMAC.digest('sha256', hmackey, request_string)
signature = URI::encode(Base64.encode64(hmac))

的Python:

hmac = hmac.new(self.hmackey, urltosign, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(hmac)

2 个答案:

答案 0 :(得分:7)

Python使用RFC 3548进行base64转换。其他语言如Ruby,Java(可能RFC 2045)他们可能使用不同的RFC进行转换。因此,您可能会发现很少有人使用/而很少有人在其编码字符串上使用+

因此,如果您需要与它们匹配,只需在编码后替换等效的字符。

答案 1 :(得分:2)

要添加到@Sabuj Hassan的出色答案中。

在Ruby中,您可以执行Base64.urlsafe_encode64来遵守RFC 4648,这似乎更加通用。

来自the docs

  

返回bin的Base64编码版本。此方法符合RFC 4648中的“使用URL和文件名安全字母进行Base 64编码”。字母使用'-'代替'+'和'_'代替'/'。