Openssl 如何正确生成IV

Openssl 如何正确生成IV,openssl,php-openssl,Openssl,Php Openssl,我想用对称密钥编码,在CBC模式下使用AES-256加密一些数据。我在web上看到了不同的实现,哪种方式是生成适当IV的最佳方式(如果有的话) 方法1: $secret_iv = 'This is my secret iv'; $iv = substr(hash('sha256', $secret_iv), 0, 16); IV是通过一些输入用sha256生成的(我知道最好对每个加密数据使用不同的IV,所以我会生成一些随机内容作为sha265散列的种子)。由于AES-256-CBC所期望的长度

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

方法1:

$secret_iv = 'This is my secret iv';
$iv = substr(hash('sha256', $secret_iv), 0, 16);
IV是通过一些输入用sha256生成的(我知道最好对每个加密数据使用不同的IV,所以我会生成一些随机内容作为sha265散列的种子)。由于AES-256-CBC所期望的长度,IV被截断为16

方法2:

$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
openssl\u random\u pseudo\u bytes
生成一些长度为16的二进制输出


使用经典字符串或二进制字符串作为IV是否有显著区别?

IV由字节组成

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

为了提高安全性,您应该生成一个随机IV

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

因此,在您的示例中,您应该更喜欢方法2