【问题标题】:CryptoJS, check if AES passphrase is correctCryptoJS,检查 AES 密码是否正确
【发布时间】:2014-04-20 23:08:11
【问题描述】:
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");

var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");

假设加密和解密阶段是分开的(发生在程序的不同部分),有什么方法可以检查"Secret Passphrase" 在解密阶段是否正确?

我注意到使用错误的密码进行解密会导致decrypted.toString() 成为空字符串。如果原始消息也是一个空字符串怎么办?没有其他参数可以用来检查密码是否确实正确吗?


附注

我当前的解决方案:始终创建一个非空的控制值,用密码加密。如果控制值解密为“”,则密码不正确。

编辑:结果我的解决方案不起作用。非常相似的密码短语将消息解密为不同的值,这些值仍然不同于空字符串。安全性没有受到影响,但我仍然无法查看密码是否正确。

this is my very cool key!this is my very cool key!! 都返回一个字符串,尽管只有第一个是用于加密的实际密码。

编辑 2:从错误密码返回的字符串不是有效的 UTF-8。因此,调用 value.toString(CryptoJS.enc.Utf8) 会返回错误。我可以使用此错误来检查密码是否正确。不过,这种解决方案非常糟糕!

【问题讨论】:

    标签: javascript encryption cryptojs


    【解决方案1】:

    您刚刚偶然发现了消息机密性和消息完整性/身份验证之间微妙但重要的区别。

    机密性是您当前正在做的事情,它确保在没有关联密钥的情况下无法在传输过程中读取消息,但无法确保消息在传输过程中未被更改(对早期加密系统的攻击涉及修改用于注入或揭示有关加密系统信息的加密消息)。您的问题是这种情况的一个变体,如果您碰巧找到了将“投降”消息解密为“炸弹”的密钥,那么就无法知道他们的密钥已被切换。

    完整性处理首先确保解密的内容是实际加密的内容,并且还可以根据使用的模型确保身份验证(谁加密它)。完整性最好通过使用mode of operation 来实现,它本质上支持它,例如GCM,但粗略一看,crypto-js 不支持任何完整性模式。

    这为您提供了一种手动方法,需要生成并发送 HMAC 以及加密消息。

    var message = "Message";
    var passphrase = "Secret Passphrase";
    var encrypted = CryptoJS.AES.encrypt(message, passphrase).toString();
    var hmac = CryptoJS.HmacSHA256(encrypted, CryptoJS.SHA256(passphrase)).toString();
    var transitmessage = hmac + encrypted;
    
    //other side
    
    var transithmac = transitmessage.substring(0, 64);
    var transitencrypted = transitmessage.substring(64);
    var decryptedhmac = CryptoJS.HmacSHA256(transitencrypted, CryptoJS.SHA256(passphrase)).toString();
    alert(transithmac == decryptedhmac);
    var decrypted = CryptoJS.AES.decrypt(transitencrypted, passphrase).toString(CryptoJS.enc.Utf8);
    alert(decrypted.toString(CryptoJS.enc.Utf8));
    

    理论上,IV 也应该在 HMAC 调用之前添加到加密消息之前,但我不确定如何使用 crypto-js 将 IV 取出,我希望保持这个示例足够简单,除非你期望作为 NSA 的目标,这应该足够了,因为 IV 已经修改了加密的消息。

    【讨论】:

    • 您的代码运行良好,但我仍在尝试了解它是如何工作的 :( 假设任何人都截获了transitmessage:他们能用它做什么?它是否容易受到暴力或彩虹表的攻击?
    • 请注意,如果这有帮助的话,我的“控制值”解决方案并不关心消息的内容:我只需要知道密码是否是正确。
    • 暴力破解几乎是不可能的。如果有人要暴力破解 HmacSHA256 函数以获得 HMAC 冲突,那么所有将显示的将是实际密码的 SHA256 哈希,然后也必须强制执行。直接攻击加密消息实际上会更容易。
    • 不错。值得一提的是,HMAC 密码和消息密码不必相同。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2015-12-28
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2016-11-25
    相关资源
    最近更新 更多