【问题标题】:jsSHA, CryptoJS and OpenSSL libraries giving different resultsjsSHA、CryptoJS 和 OpenSSL 库给出不同的结果
【发布时间】:2012-11-20 05:35:31
【问题描述】:

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=

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

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

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

提前致谢。

【问题讨论】:

    标签: javascript cryptography sha1 hmac


    【解决方案1】:

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

    您缺少enc-base64-min.jscrypto-js。没有它,CryptoJS.enc.Base64 将是 undefined
    调用.getHMAC() 时缺少参数。这是.getHMAC(secret, secret_type, hash_type, output_encoding)
    使用 1+2 添加 = 不是必需的(也不是正确的)

    <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>  
    <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>  
    
    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", "SHA-1", "B64");
    
    return  "crypto answer is " + crypto + " jssha answer is " + jssha;
    

    Example

    【讨论】:

    • 太棒了,谢谢!这几乎行得通。我看到它在 jsfiddle 中完美运行,但是用你的建议更新我的代码给我留下了两个问题:1)jsSHA 自述文件说在包含 sha1.js 时省略算法名称。您对我的本地主机的建议生成了“未定义格式”,将“SHA-1”作为输出格式(我认为)窒息。我通过包含 sha.js 而不是 sha1.js 来实现这一点。够好了。但更严格:(2)在我的钻机上,crypto 附加了尾随的“=”,但 jsSHA 没有。不过,sigs 是一样的,所以我已经很感激你的回答了!
    • 我刚刚尝试包含来自raw.github.../sha1.js 的 js,就像您在 jsfiddle 上所做的那样。现在这样做给了我一个完美的结果。所以再次感谢。我现在的项目有下载1.3.1的zip后本地复制的js。我将把它标记为正确(和+1)。你能告诉我包含像 jssha 这样的库的正确做法是什么吗?
    • 快速搜索没有显示托管此库的 CDN,因此我将使用本地副本。
    • 啊,但是本地副本无法添加尾随'='。我应该只附加一个吗?我对包含内容的最佳实践(以及 hmac 中 = 的语义)有点困惑。我在这里提出了一个新问题,非常感谢您的帮助。 stackoverflow.com/questions/13672414/…
    • 为什么不直接从 github 复制当前版本并像我在示例中所做的那样使用它?
    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2021-09-25
    • 2023-03-30
    相关资源
    最近更新 更多