PHP Mcrypt加密无需IV。

3

我需要使用一种加密机制。我选择了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的情况下进行加密存在任何重大安全问题吗?

1
为什么你特别使用 MCRYPT_DEV_RANDOM?尝试使用 MCRYPT_DEV_URANDOM 看看是否更加即时。除此之外,你应该等待一个密码学专家的建议,但就我有限的知识而言,你肯定需要一个 IV。 - deceze
@deceze 您的解决方案是正确的,使用 MCRYPT_DEV_URANDOM 的性能非常好。但我更倾向于查看描述性答案。 - kuldeep.kamboj
1
可能是 https://dev59.com/gGXWa4cB1Zd3GeqPL1Va 的重复问题? - Siguza
1个回答

4
DEV_RANDOM 会从 /dev/random 或者类似的源产生随机整数,该源监听诸如鼠标移动、键盘按键等不可预测的数据生成安全数据。如果没有按键等数据,它就会等待足够的数据……这就是它慢的原因。 DEV_URANDOM 使用 /dev/urandom 或者类似的源,虽然可能也会使用上述数据,但除此之外,还会组合伪随机数发生器以实时提供随机数据(这种方法更加可预测,但这通常并不重要)。
它们用于确定 IV 构建的方式。
现在来看看 IV。
IV 用于派生加密函数使用的随机函数的初始种子。
你使用 ECB。首先要注意的是,ECB 不使用 IV,所以你写的那句话没有意义;如果你使用 ECB,可以完全跳过创建 IV,而且可以无问题地解密数据。但另一件事是,你不应该使用 ECB。ECB 对你的数据进行编码,使得每个具有相同数据的块看起来都是一样的。另一方面,CBC 使用前一个块的数据对每个块进行异或操作(为此,需要 IV)。为了演示这两种模式之间的区别,请看下面这个例子:
从左到右:原始图像、使用 ECB 模式编码的图像和使用 CBC 模式编码的图像。
如果你想使用 CBC,你还应该为单独加密的每个数据重新生成 IV,否则它就跟使用 ECB 一样糟糕。每次重新生成 IV 可以防止基于重复的攻击。
最后,如果你使用 CBC,你将需要存储它的 IV,以便稍后可以解密文本。如果不这样做,你会得到垃圾数据。足够幸运的是,大多数加密算法都被设计成 IV 可以公开,所以你不必担心保持 IV 的机密性。
TL;DR: 使用 CBC 与为每个数据单独重新生成的公共 IV。
(此外……如果你不关心解密,你可能会对密码哈希更感兴趣。)

如果使用DEV_URANDOM或DEV_RANDOM,在安全方面有什么区别吗? - kuldeep.kamboj
这在链接的答案中已经解释得很清楚了。大多数情况下,使用/dev/urandom就足够了;只有当你真的很偏执时才应该使用/dev/random这篇文章讲得非常好。 - rr-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接