0

我有一个小代码片段,我正试图在 Ruby 中工作。

digest = HMAC.digest(Digest.new(SHA1), Base64.decode64(key), HashString) return Base64.encode64(digest.to_s()).chomp()

我尝试如下:

hashstring = "POST application/octet-stream
Thu, 05 Jun 2008 16:38:19 GMT /rest/objects date:Thu, 05 Jun 2008 16:38:19 GMT groupacl:other=NONE listable-meta:part4/part7/part8=quick meta:part1=buy
id: 6039ac182f194e15b9261d73ce044939/user1 useracl:jane=FULL_CONTROL,juan=WRITE"

key = "AKLuryj6zs8ste4Y3jTGQp71xq0="


def hash(hs, keyh)
  digest = HMAC.digest(Digest.new(SHA1), Base64.decode64(keyh), hs)
  return Base64.encode64(digest.to_s()).chomp()
end

puts hash hashstring,key

这给了我错误 file.rb:1:in `require': no such file to load -- hmac-md5 (LoadError) from file.rb:1

我不熟悉 ruby​​ 或 include/require 模块的工作方式。(或者如果它们与语言捆绑在一起或需要单独下载。我缺少什么文件/代码来实现这个功能?

4

2 回答 2

7

您需要安装ruby​​-hmac 模块。请参阅此博客文章以获得温和的介绍。

于 2009-12-10T20:39:21.190 回答
0

似乎有什么严重的错误。Ruby 告诉您正在尝试调用require脚本的第一行,并且它找不到您告诉它加载的文件。但!您没有调用 require脚本的第一行!事实上,您不会在脚本中的require 任何地方调用。

某些东西必须被严重破坏。

我在您的代码中看到的一个潜在问题是,这hash是 Ruby 中的一种标准方法,它已经为完全不同的目的而定义。覆盖它可能迟早会导致问题。但是,您看到的错误发生在我们之前,所以它与手头的直接问题无关。

据我所知,这似乎是你想要做的:

require 'openssl'
require 'base64'

DIGEST = OpenSSL::Digest::Digest.new('sha1')

def hmac(hs, keyh)
  digest = OpenSSL::HMAC.digest(DIGEST, Base64.decode64(keyh), hs)
  return Base64.encode64(digest).chomp
end

require 'test/unit'
class TestHmac < Test::Unit::TestCase
  def test_that_the_hmac_gets_computed_correctly
    hashstring = 'POST application/octet-stream
Thu, 05 Jun 2008 16:38:19 GMT /rest/objects date:Thu, 05 Jun 2008 16:38:19 GMT groupacl:other=NONE listable-meta:part4/part7/part8=quick meta:part1=buy
id: 6039ac182f194e15b9261d73ce044939/user1 useracl:jane=FULL_CONTROL,juan=WRITE'
    key        = 'AKLuryj6zs8ste4Y3jTGQp71xq0='
    assert_equal 'KxQMJeaVqxFdujha89UuksEUiAg=', hmac(hashstring, key)
  end
end

但是我仍然很困惑,require当你从一开始就没有调用它时,你怎么会得到一条错误消息。

于 2009-12-10T21:04:55.540 回答