如何正确生成 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。
我想使用 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。