【问题标题】:php mcrypt encryption without IV没有IV的php mcrypt加密
【发布时间】:2015-07-27 09:33:22
【问题描述】:

我需要使用加密机制。我选择了 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 的加密有什么大的安全问题呢?

【问题讨论】:

  • 你为什么专门使用MCRYPT_DEV_RANDOM。试试MCRYPT_DEV_URANDOM 看看是否更直接。除此之外,您应该等待密码学专家,但就我有限的知识而言,您当然需要 IV。
  • @deceze 您的解决方案是对的,MCRYPT_DEV_URANDOM 的性能非常好。但我会更多地查看描述性答案。

标签: php performance mcrypt initialization-vector


【解决方案1】:

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 有任何安全方面的差异?
  • 这在链接的答案中得到了很好的解释。大多数时候使用/dev/urandom 就足够了; /dev/random 只有当你真的很偏执时才应该使用。 Here's 文章解释得很好。
猜你喜欢
  • 2023-04-06
  • 2016-01-29
  • 2022-12-16
  • 2014-06-28
  • 2011-01-24
  • 2015-11-10
  • 2021-02-13
  • 2015-10-17
  • 2011-11-18
相关资源
最近更新 更多