如何正确生成 IV

How to properly generate an IV

我想使用 CBC 模式下的 AES-256 使用对称密钥编码来加密一些数据。我在网上看到了不同的实现方式,哪种方式最好(如果有的话)生成合适的 IV?

方法一:

$secret_iv = 'This is my secret iv';
$iv = substr(hash('sha256', $secret_iv), 0, 16);

IV 只是通过某些输入使用 sha256 生成的(据我所知,最好为每个加密数据使用不同的 IV,因此我会生成一些随机的东西作为 sha265 哈希的种子)。然后 IV 被截断为 16 的长度,因为这是 AES-256-CBC 所期望的。

方法二:

$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

openssl_random_pseudo_bytes 生成一些长度为 16 的二进制输出。

使用经典字符串或二进制字符串作为 IV 有什么显着差异吗?

IV由字节组成。

这些字节是否可以表示为字符串并不重要。

为了增加安全性,您应该生成一个随机 IV。

确实,给定一个加密密钥,如果 IV 是随机选择的,并且如果您对相同的纯文本加密两次,则不会产生相同的密文。

所以在你的例子中你应该更喜欢方法 2。