微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有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一起使用.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐