匹配用Ruby on Rails和JavaScript加密的签名头

匹配用Ruby on Rails和JavaScript加密的签名头,javascript,ruby-on-rails,encryption,cryptojs,api-auth,Javascript,Ruby On Rails,Encryption,Cryptojs,Api Auth,我正在使用ApiAuth gem(找到时)来签署我的请求。我还使用CryptoJS(如找到的)编写自己的JavaScript代码,通过检查ApiAuth生成的加密头与代码生成的头来提供身份验证 以下是ApiAuth Gem的代码片段: def hmac_signature(headers, secret_key, options) if options[:with_http_method] canonical_string = headers.canonical_string_wit

我正在使用ApiAuth gem(找到时)来签署我的请求。我还使用CryptoJS(如找到的)编写自己的JavaScript代码,通过检查ApiAuth生成的加密头与代码生成的头来提供身份验证

以下是ApiAuth Gem的代码片段:

def hmac_signature(headers, secret_key, options)
  if options[:with_http_method]
    canonical_string = headers.canonical_string_with_http_method(options[:override_http_method])
  else
    canonical_string = headers.canonical_string
  end
  digest = OpenSSL::Digest.new('sha1')
  b64_encode(OpenSSL::HMAC.digest(digest, secret_key, canonical_string))
end
以下是我用JavaScript编写的等效代码:

function hmacSignature(request, appSecret) {
 return CryptoJS.HmacSHA1(canonicalString(request), appSecret).toString(CryptoJS.enc.Base64);}
这两者不会生成相同的加密头。我尝试使用jsSHA做同样的事情,虽然jsSHA和CryptoJS生成的加密头是相同的,但它们与ApiAuth生成的头不匹配

请帮助我找出如何使这项工作

编辑:

将规范字符串作为“message”并将appSecret作为“secret”,我从ApiAuth和CryptoJS获得相同的值,即:

DK9kn+7klT2Hv5A6wRdsReAo3xY=


我发现我的原始代码中出现了问题,因为我的JS代码中设置的时间戳与ApiAuth中设置的时间戳不匹配。

我修复了我的问题,并编写了此答案,希望它能帮助其他人寻找此问题的解决方案

  • 首先让我说,无论是用Ruby、JS还是任何其他语言加密,这两种加密都应该是相同的
  • 检查发送到两个位置的输入的每个部分是否完全相同,这一点很重要
  • 当我检查JS文件和gem的输入时,我意识到由于某种原因,时间戳(我在JS文件中设置的)没有正确地发送到gem

    我一步一步地调试代码,找出了错误所在。我将概述以下一些可能的问题:

  • 我在JS中设置时间戳,如下所示

    请求.标题[“日期”]

  • 我意识到这个设置不正确,所以我不得不将“DATE”更改为“DATE1”,并相应地更改其余代码。这起作用了

  • 其次,我发送的时间戳与gem期望的httpgst类型的时间戳不兼容。这是发送时间戳时必须记住的另一件事

  • 我修复了我的问题,并写下了这个答案,希望它能帮助其他人找到解决这个问题的方法

  • 首先让我说,无论是用Ruby、JS还是任何其他语言加密,这两种加密都应该是相同的
  • 检查发送到两个位置的输入的每个部分是否完全相同,这一点很重要
  • 当我检查JS文件和gem的输入时,我意识到由于某种原因,时间戳(我在JS文件中设置的)没有正确地发送到gem

    我一步一步地调试代码,找出了错误所在。我将概述以下一些可能的问题:

  • 我在JS中设置时间戳,如下所示

    请求.标题[“日期”]

  • 我意识到这个设置不正确,所以我不得不将“DATE”更改为“DATE1”,并相应地更改其余代码。这起作用了

  • 其次,我发送的时间戳与gem期望的httpgst类型的时间戳不兼容。这是发送时间戳时必须记住的另一件事

  • 两点:您可能在
    CryptoJS.HmacSHA
    中有输入错误-mine CryptoJS不知道这种方法,需要指定特定的算法,例如
    CryptoJS.HmacSHA1
    。而且,如果这是一个打字错误,你能为两个版本提供一个工作样本,给出一些测试输入并显示结果摘要,这样我们就可以测试和比较一些东西了吗?谢谢,你好。对应该是SHA1。我会修正错误的。就示例而言,您可以使用“message”和“secret”作为输入来替换规范字符串和appSecret。如果我这样做,我会得到两个不同的加密值。它们不一样。两点:您可能在
    CryptoJS.HmacSHA
    中有输入错误-mine CryptoJS不知道这种方法,需要指定特定的算法,例如
    CryptoJS.HmacSHA1
    。而且,如果这是一个打字错误,你能为两个版本提供一个工作样本,给出一些测试输入并显示结果摘要,这样我们就可以测试和比较一些东西了吗?谢谢,你好。对应该是SHA1。我会修正错误的。就示例而言,您可以使用“message”和“secret”作为输入来替换规范字符串和appSecret。如果我这样做,我会得到两个不同的加密值。他们不一样。