Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用CryptoJS加密和用php解密:IV的用途是什么?_Javascript_Php_Encryption_Cryptojs_Initialization Vector - Fatal编程技术网

Javascript 用CryptoJS加密和用php解密:IV的用途是什么?

Javascript 用CryptoJS加密和用php解密:IV的用途是什么?,javascript,php,encryption,cryptojs,initialization-vector,Javascript,Php,Encryption,Cryptojs,Initialization Vector,我正在寻找一种方法,用CryptoJS加密密码,然后用php解密。我看过其他关于同一主题的帖子,但我需要有人解释所有的IV和关键内容 My CryptoJS加密代码: password = document.getElementById("usrp").value; password = CryptoJS.AES.encrypt(password, <?php echo '"'.$_SESSION['adk'].'"'; ?>); password=document.getElem

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

My CryptoJS加密代码:

password = document.getElementById("usrp").value;
password = CryptoJS.AES.encrypt(password, <?php echo '"'.$_SESSION['adk'].'"'; ?>);
password=document.getElementById(“usrp”).value;
password=CryptoJS.AES.encrypt(密码,);
IV 您使用的是CBC操作模式,需要一个IV。如果您对所有密文使用静态IV,那么您就错过了加密的一个重要属性,即语义安全性。如果您使用相同的IV,攻击者可能会观察您的密文,并确定您是否使用相同的密钥发送相同的明文,因为密文将是相同的

为了防止这种情况,可以为每次加密生成一个随机IV。静脉注射不一定是秘密的,但必须是不可预测的。因为它不必是秘密的,所以您可以简单地将其预编到密文中,并在解密之前将其切掉,或者以结构化方式发送它。在解密过程中需要使用IV。否则,第一个块将不同于原始纯文本

请记住,CryptoJS'
WordArray.random()
在内部使用
Math.random()
,这在加密方面是不安全的。最好使用更好的随机性源。对于使用WebCryptoAPI的半现代浏览器,您可以使用此下拉菜单替换该函数:

(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并且开发人员不更改代码,就完全安全。

到底是什么问题?“解释所有的静脉注射和关键的东西”并不是一个明确的回答。你有什么问题吗?你的静脉注射和关键的东西有什么问题?AES用一个密钥(密码)加密数据,如果你使用相同的密钥,你会得到相同的数据。在其他帖子中,他们有某种iv字符串,其中包含随机数,需要生成iv还是我可以只输入随机数?你根本不需要CrypoJS的iv字符串。你很好地解释了所有iv和密钥的内容;-)我只想补充一点,IV不仅在CBC模式下需要,而且为特定应用程序选择合适的模式是一件需要花费一些时间的事情。好的,但是如何实现更安全的随机化API呢?我是把它放在cryptojs aes文件还是什么?在使用它之前把它放在脚本块中。它可以放在你自己代码的开头,所以如果我把它放在一个脚本块中,javascript函数
CryptoJS.lib.WordArray.random(128/8)
将使用您的脚本吗?@jo01是的,它将使用。