如何正确生成IV

时间:2018-03-12 11:52:04

标签: openssl php-openssl

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

方法1:

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

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

方法2:

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

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

使用经典字符串或二进制字符串作为IV?

是否有任何显着差异

1 个答案:

答案 0 :(得分:2)

IV由字节组成。

这些字节是否可以表示为字符串无关紧要。

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

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

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