【问题标题】:Encrypting with CryptoJS and decrypt with php: What is the use of the IV?用 CryptoJS 加密,用 php 解密:IV 有什么用?
【发布时间】:2015-10-17 11:54:10
【问题描述】:

我正在寻找一种方法,在 CryptoJS 中加密密码,然后在 php 中解密。我看过其他关于同一主题的帖子,但我需要有人解释所有 IV 和关键内容。

我的 CryptoJS 加密代码:

password = document.getElementById("usrp").value;
password = CryptoJS.AES.encrypt(password, <?php echo '"'.$_SESSION['adk'].'"'; ?>);

【问题讨论】:

  • 到底是什么问题? “解释所有 iv 和关键的东西” 真的不是一个具体的可回答的陈述。
  • 您有什么问题吗? 所有这些 iv 和 key 的东西有什么问题? AES 使用密钥(密码)加密数据,如果您使用相同的密钥,您将获得相同的数据。
  • 在其他帖子中,他们有某种 iv 字符串,其中包含随机数,是否需要生成 iv 或者我可以只输入随机数吗?
  • CrypoJS 根本不需要 iv 字符串。

标签: javascript php encryption cryptojs initialization-vector


【解决方案1】:

IV

您正在使用需要 IV 的 CBC 操作模式。如果您对所有密文都使用静态 IV,那么您将错过加密的一个重要属性,即语义安全性。如果你使用相同的IV,攻击者可能会观察你的密文并判断你是否使用相同的密钥发送了相同的明文,因为密文将是相同的。

为防止这种情况发生,您可以为每次加密生成一个随机 IV。 IV 不一定是秘密的,但它必须是不可预测的。由于它不必保密,您可以简单地将其添加到密文中并在解密之前将其切掉,或者以结构化方式发送。您需要在解密期间使用 IV。否则,第一个块将与原始明文不同。

请记住,CryptoJS 的 WordArray.random() 在内部使用 Math.random(),这在密码学上是不安全的。最好使用更好的随机源。对于使用 WebCrypto API 的半现代浏览器,您可以使用 my project 中的这个替换函数:

(function(C){
    var WordArray = C.lib.WordArray;
    var crypto = window.crypto;
    var TypedArray = Int32Array;
    if (TypedArray && crypto && crypto.getRandomValues) {
        WordArray.random = function(nBytes){
            var array = new TypedArray(Math.ceil(nBytes / 4));
            crypto.getRandomValues(array);
            return new WordArray.init(
                    [].map.call(array, function(word){
                        return word
                    }),
                    nBytes
            );
        };
    } else {
        console.log("No cryptographically secure randomness source available");
    }
})(CryptoJS);

并像这样使用它:

var iv = CryptoJS.lib.WordArray.random(128/8);

密钥比较棘手,因为它需要保密。基本方式是:

让用户输入服务器上也存在的密码,并从密码中获取密钥,例如使用 CryptoJS 也提供的 PBKDF2。 只要您使用 TLS 并且开发人员不更改代码,就绝对安全。

【讨论】:

  • 您很好地解释了所有 IV 和关键内容 ;-) 我只想补充一点,IV 不仅在 CBC 模式中需要,而且选择了适当的模式对于一个特定的应用程序是一个应该花一些时间的东西。
  • 好的,但是如何实现更安全的随机化 API?我是把它放在cryptojs aes文件中还是什么?
  • 在使用前将其放入脚本块中。它可以放在你自己代码的开头。
  • 所以如果我把它放在一个脚本块中,javascript函数CryptoJS.lib.WordArray.random(128/8);会使用你的脚本吗?
  • @Jojo01 是的,会的。
猜你喜欢
  • 2015-06-13
  • 2015-08-27
  • 2022-12-16
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2014-12-24
相关资源
最近更新 更多