在Ruby中使用HMAC SHA256

31
我将尝试应用HMAC-SHA256来为Rest API生成密钥。
我的操作步骤如下:
def generateTransactionHash(stringToHash)
  key = '123'
  data = 'stringToHash'
  digest = OpenSSL::Digest.new('sha256')

  hmac = OpenSSL::HMAC.digest(digest, key, data)
  puts hmac
end

这始终会输出这个结果:(如果我将“12345”或“HUSYED815X”作为参数,则会得到相同的结果)
ۯw/{o���p�T����:��a�h��E|q

由于某些原因,API无法正常工作... 有人能帮我解决吗?


根据文档 digest:返回实例所代表的身份验证代码作为二进制字符串。 - Mike Szyndel
2
也许你应该使用 hexdigest,它与 digest 具有相同的签名,但返回十六进制编码的字符串(从文档中看,它似乎是相同的字符串,但易于人类阅读)。 - Mike Szyndel
使用hexdigest完美地工作了!谢谢您。 - Eduardo Pedroso
7
既然我解决了你的问题,如果你让我来回答而不是自己去做的话,那就更好了。 - Mike Szyndel
抱歉 @MichalSzyndel,已经删除了答案。 - Eduardo Pedroso
4个回答

55
根据文档 OpenSSL::HMAC.digest

返回表示实例的身份验证代码的二进制字符串。

如果您使用时遇到问题,可以尝试使用提供十六进制编码形式的OpenSSL::HMAC.hexdigest
示例
key = 'key'
data = 'The quick brown fox jumps over the lazy dog'
digest = OpenSSL::Digest.new('sha256')

OpenSSL::HMAC.digest(digest, key, data)
#=> "\xF7\xBC\x83\xF40S\x84$\xB12\x98\xE6\xAAo\xB1C\xEFMY\xA1IF\x17Y\x97G\x9D\xBC-\x1A<\xD8"

OpenSSL::HMAC.hexdigest(digest, key, data)
#=> "f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"

在这种情况下,要使其成为HMAC SHA256,您需要在下面的注释中放置digest = OpenSSL :: Digest.new('sha256'):https://dev59.com/11sW5IYBdhLWcg3winvt#42832500 - cmunozgar
更新了 @cmunozgar 的答案,不确定为什么一开始我会放 sha1。 - Mike Szyndel
不需要创建摘要实例,只需使用字符串表示算法即可,它会像魔术般运作。OpenSSL::HMAC.hexdigest('sha256', key, data) 自 Ruby 2.5 起https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/HMAC.html#method-i-digest - Dat Le Tien

20

试试这个:

hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), key, data)

0
   def make_payment(user)
    @key= SecureRandom.hex(10)
    #puts @key
    @secret_key = @key
    puts " this is the  public key #{@secret_key}"
    @access_key= generate_key
    puts " this is the access key #{@access_key}"
    @name= @user.name
    puts "#{@name}"
    @time= Time.now.in_time_zone("Nairobi")
    puts "This is the time request sent #{@time}"
    @server_key = SecureRandom.base64
    puts "This is the server key #{@server_key}"
    @data = 'This request is being made from Learnida for users to make a payment'
    @digest = OpenSSL::Digest.new('sha256')
    uri = URI.parse("https://learnida.com")

    @hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @secret_key, @access_key)
     puts "This is the HMAC #{@hmac}"
    req = Net::HTTP::Get.new(uri)
    req['Authorization'] = "TM-HMAC-SHA256 key=#{@access_key} ts=#{@time} sign=#{@hmac}"
    res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
    @hmacdigest= OpenSSL::HMAC.digest(@digest, @server_key, @data)
    puts" This is the HMAC:SHA-256:   #{@hmacdigest}" 
    #puts res.body
    #=> "\xF7\xBC\x83\xF40S\x84$\xB12\x98\xE6\xAAo\xB1C\xEFMY\xA1IF\x17Y\x97G\x9D\xBC-\x1A<\xD8"
    @sslkey= OpenSSL::HMAC.hexdigest(@digest, @server_key, @data)
    puts @sslkey

这是如何在头部中使用Open SSL和HMAC并分配密钥的方法。 - Asher Namanya
这是您如何在头部中使用Open SSL和HMAC,并分配密钥的方法。 - undefined

-1
在我的情况下(Ticketmatic),我必须像上面那样创建HMAC,并在请求中添加一个带有HMAC的授权头。
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secret_key, access_key + name + time)
req = Net::HTTP::Get.new(uri)
req['Authorization'] = "TM-HMAC-SHA256 key=#{access_key} ts=#{time} sign=#{hmac}"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }

你可以在这里找到完整的代码片段here
另外,这里还有一篇更详细的博客文章here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接