匹配用Ruby on Rails和JavaScript加密的签名头
我正在使用ApiAuth gem(找到时)来签署我的请求。我还使用CryptoJS(如找到的)编写自己的JavaScript代码,通过检查ApiAuth生成的加密头与代码生成的头来提供身份验证 以下是ApiAuth Gem的代码片段:匹配用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
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中设置的时间戳不匹配。我修复了我的问题,并编写了此答案,希望它能帮助其他人寻找此问题的解决方案
我修复了我的问题,并写下了这个答案,希望它能帮助其他人找到解决这个问题的方法
两点:您可能在
CryptoJS.HmacSHA
中有输入错误-mine CryptoJS不知道这种方法,需要指定特定的算法,例如CryptoJS.HmacSHA1
。而且,如果这是一个打字错误,你能为两个版本提供一个工作样本,给出一些测试输入并显示结果摘要,这样我们就可以测试和比较一些东西了吗?谢谢,你好。对应该是SHA1。我会修正错误的。就示例而言,您可以使用“message”和“secret”作为输入来替换规范字符串和appSecret。如果我这样做,我会得到两个不同的加密值。它们不一样。两点:您可能在CryptoJS.HmacSHA
中有输入错误-mine CryptoJS不知道这种方法,需要指定特定的算法,例如CryptoJS.HmacSHA1
。而且,如果这是一个打字错误,你能为两个版本提供一个工作样本,给出一些测试输入并显示结果摘要,这样我们就可以测试和比较一些东西了吗?谢谢,你好。对应该是SHA1。我会修正错误的。就示例而言,您可以使用“message”和“secret”作为输入来替换规范字符串和appSecret。如果我这样做,我会得到两个不同的加密值。他们不一样。