php 没有 IV 的 mcrypt 加密
php mcrypt encryption without IV
我需要使用加密机制。我选择了 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。首先要注意的是ECB不使用IV,所以你写的没有意义;如果你使用 ECB,你可以完全跳过创建 IV,你将能够毫无问题地解密你的数据。但另一件事是 你不应该使用 ECB。 ECB 对你的数据进行编码,这样每个具有相同数据的块看起来都一样。另一方面,CBC 将每个块与前一个块的数据进行异或运算(为此,它需要 IV)。为了证明它们之间的区别,请看这个:
从左到右:原图、ECB模式编码图像、CBC模式编码图像
如果你想使用CBC,你也应该为你单独加密的每条数据重新生成IV,否则和使用ECB一样糟糕。每次重新生成 IV 可防止基于重复的攻击。
最后,如果您使用 CBC,您将 需要存储它的 IV,以便稍后解密文本。如果你不这样做,你会得到垃圾。幸运的是,大多数加密算法的设计都使 IV 可以是 public,因此您不必担心将 IV 保密。
TL;DR: 使用 CBC,public 分别为每个数据重新生成 IV。
(另外...如果您不关心解密,您可能会对密码哈希感兴趣。)
我需要使用加密机制。我选择了 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。首先要注意的是ECB不使用IV,所以你写的没有意义;如果你使用 ECB,你可以完全跳过创建 IV,你将能够毫无问题地解密你的数据。但另一件事是 你不应该使用 ECB。 ECB 对你的数据进行编码,这样每个具有相同数据的块看起来都一样。另一方面,CBC 将每个块与前一个块的数据进行异或运算(为此,它需要 IV)。为了证明它们之间的区别,请看这个:
从左到右:原图、ECB模式编码图像、CBC模式编码图像
如果你想使用CBC,你也应该为你单独加密的每条数据重新生成IV,否则和使用ECB一样糟糕。每次重新生成 IV 可防止基于重复的攻击。
最后,如果您使用 CBC,您将 需要存储它的 IV,以便稍后解密文本。如果你不这样做,你会得到垃圾。幸运的是,大多数加密算法的设计都使 IV 可以是 public,因此您不必担心将 IV 保密。
TL;DR: 使用 CBC,public 分别为每个数据重新生成 IV。
(另外...如果您不关心解密,您可能会对密码哈希感兴趣。)