我正在使用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)
答案 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编码”。字母使用'-'代替'+'和'_'代替'/'。