jsSHA,CryptoJS和OpenSSL库给出了不同的结果

时间:2012-12-02 17:11:51

标签: javascript cryptography sha1 hmac

JS新手,我也在学习使用加密库。我不明白为什么使用相同的秘密签署/编码相同的消息会产生不同的结果。

我正在使用jsSHA 1.3.1 found hereCryptoJS 3.0.2 described here尝试创建base64 sha-1编码的hmac签名。这是代码:

在html中......

<script src="lib/jsSHA/src/sha1.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha1.js"></script>

在js ......

var message = "shah me";
var secret = "hide me";
var crypto = CryptoJS.HmacSHA1(message, secret).toString(CryptoJS.enc.Base64) + '=';

var shaObj = new jsSHA(message, "ASCII");
var jssha = shaObj.getHMAC(secret, "ASCII", "B64") + '=';

return  "crypto answer is " + crypto + " jssha answer is " + jssha;

你能帮我解释为什么这些结果有所不同吗?

  

加密答案是3e929e69920fb7d423f816bfcd6654484f1f6d56 = jssha   答案是PpKeaZIPt9Qj + Ba / zWZUSE8fbVY =

更重要的是,这两者都与我在轨道中生成的签名不同,就像这样......

digest  = OpenSSL::Digest::Digest.new('sha1')
raw_signature = OpenSSL::HMAC.digest(digest, "hide me","shah me")
b64_signature = Base64.encode64(raw_signature).strip

(本来想提供一个小提琴,这似乎是一个非常好的常见做法,但这对我来说也是新的,我无法让一个人为这个问题工作。)

提前致谢。

1 个答案:

答案 0 :(得分:7)

您的代码中有3个错误:)

您错过enc-base64-min.js的{​​{1}}。没有它,crypto-js将是CryptoJS.enc.Base64
您在调用undefined时错过了参数。它是.getHMAC()
1 + 2添加.getHMAC(secret, secret_type, hash_type, output_encoding)不是必需的(也不是正确的)

=

Example