编程语言
首页 > 编程语言> > 没有IV的PHP Mcrypt加密

没有IV的PHP Mcrypt加密

作者:互联网

我需要使用加密机制.我选择了mcrypt,因为它可用且用于其示例.但是我看到生成时间太多了.当我在给定的示例中使用IV时,删除它花了很多时间,但它立即生成了加密值.

// Code example using IV
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_RANDOM);

$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB, $iv);
return base64_encode($encryptedString);

// Code example without IV    
$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB);
return base64_encode($encryptedString); 

因此,如果不使用IV加密是否存在任何重大的安全问题?

解决方法:

DEV_RANDOM从/ dev / random或等效项生成随机整数,该整数侦听不可预测的数据(例如鼠标移动,键盘击打等)以生成安全数据.如果没有击键等,它只会等到有足够的数据…这就是为什么它很慢.

DEV_URANDOM使用/ dev / urandom或同等功能,虽然它也可能使用上面的数据,但除此之外,它还结合了伪随机数生成器为您实时提供随机数据(这是可预测的,但这通常无关紧要) )

它们用于确定IV的构造方式.

现在到IV.

IV用于导出加密函数使用的随机函数的初始种子.

您使用ECB.首先要注意的是,欧洲央行没有使用IV,因此您编写的内容没有任何意义.如果使用ECB,则可以完全跳过创建IV,并且可以解密数据而不会出现问题.但是另一件事是您不应该使用ECB. ECB对您的数据进行编码,以使每个具有相同数据的块看起来都一样.另一方面,CBC将每个块与前一个块的数据进行异或运算(为此,它需要IV).为了说明两者之间的区别,请看以下内容:

从左到右:原始图像,以ECB模式编码的图像和以CBC模式编码的图像.

如果要使用CBC,还应该为分别加密的每个数据重新生成IV,否则与使用ECB一样糟糕.每次重新生成IV都会防止基于重复的攻击.

最后,如果使用CBC,则需要存储其IV,以便以后可以解密文本.如果不这样做,您将得到垃圾.幸运的是,大多数加密算法的设计都使IV可以公开,因此您不必担心将IV保密.

TL; DR:将CBC与分别为每个数据重新生成的公共IV一起使用.

(此外…如果您不关心解密,则可能会对加密哈希表感兴趣.)

标签:mcrypt,performance,initialization-vector,php
来源: https://codeday.me/bug/20191028/1951605.html