python - 将 Python 的 base64.b64encode(hmac.new().hexdigest()) 转换为 Ruby

标签 python ruby base64 hmacsha1

我如何转换

import base64
import hashlib
import hmac
key = ''
text = 'GET\n\n\nSat, 22 Mar 2014 13:49:42 +0000\n'
base64.b64encode(hmac.new(key, text, hashlib.sha1).hexdigest())
#=> 'ZmUxN2YxMDQxMTdlODg3MDljMTRjYjY0ZGU1NDk1MjgwNzI2Yjk1Zg=='

进入 Ruby 1.9.3?

这样它返回不同的字符串:

require 'base64'
require 'digest'
require 'digest/hmac'
require 'cgi'
require 'openssl'
key = ''
text = 'GET\n\n\nSat, 22 Mar 2014 13:49:42 +0000\n'
hex = Digest::HMAC.hexdigest(key, text, Digest::SHA1)
Base64.urlsafe_encode64(hex)
#=> "YjdlNzBhMjFkZmRmZDFlMjM2Mzg5ZjYxYWE3NWEyZTJhN2I3MWNhMA=="

我应该如何生成散列以使其等于 Python 的结果?

最佳答案

首先,'\n' 在 Ruby 中的字面意思是 \n。要表示换行符,您需要使用双引号字符串:"\n"

Digest::HMAC.hexdigest参数顺序与python版本不同。并根据Digest::HMAC documetation , 不鼓励使用它。使用 OpenSSL:HMAC相反。

所以 ruby​​ 脚本应该读作:

require 'base64'
require 'openssl'
key = ''
text = "GET\n\n\nSat, 22 Mar 2014 13:49:42 +0000\n"
# hex = Digest::HMAC.hexdigest(text, key, Digest::SHA1) # <-- discouraged
hex = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), key, text)
p Base64.urlsafe_encode64(hex)
# => "ZmUxN2YxMDQxMTdlODg3MDljMTRjYjY0ZGU1NDk1MjgwNzI2Yjk1Zg=="

关于python - 将 Python 的 base64.b64encode(hmac.new().hexdigest()) 转换为 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22592389/

相关文章:

Python2.6无法导入urandom

html - Rails/Carrierwave 缩略图调整大小无法正常工作

ruby - 如何从散列的散列中删除重复值

python - 如何使用python转置和删除表中的重复值?

python - Django / python : How can I make the following number increment (not in database)

ruby-on-rails - 如何在具有 belongs_to/has_many 关系的 Active Admin 索引中显示关联模型的属性 (Rails 3.2/Active Admin)

html - base64 未在 gmail 中解码

css - 有没有办法在悬停时仅使用 css 制作 base64 编码的背景图像 png 黑白?

c# - 从 xml 文档解码 base64 编码的数据

python - 像 pubsubhubbub 这样不依赖于谷歌应用引擎的东西