php - 如何安全地为 AES CBC 加密生成 IV?

标签 php vector cryptography openssl

我从事一些加密方面的工作。

  • 我在 CBC 模式下使用 AES 256
  • 我使用 OPENSSL

我知道以下事情(来源 = 维基百科):

一个初始化向量应该是:

  • 唯一性:对于使用给定 key 加密的任何消息,不得重复
  • 不可预测:观察到任意数量的消息及其 IV 的攻击者应该没有信息来预测下一个成功概率大于 50%/bit 的消息(即与随机无法区分)

我的问题是,如何使用 OPENSSL 和 PHP 安全地生成 IV?我知道 lib mcrypt ( https://php.net/manual/en/function.mcrypt-create-iv.php ) 中有这样的功能

我没有找到任何可以使用 OPENSSL 执行此操作的东西(生成独特且不可预测的 IV)。

最佳答案

使用openssl_random_pseudo_bytes (最好将第二个参数设置为现有变量,然后您应该测试它是否设置为 TRUE)。这将生成具有适当随机特性的 IV。

$wasItSecure = false;
$iv = openssl_random_pseudo_bytes(16, $wasItSecure);
if ($wasItSecure) {
    // We're good to go!
} else {
    // Insecure result. Fail closed, do not proceed.
}

或者,PHP 7 提供 random_bytes()这要简单得多。

关于php - 如何安全地为 AES CBC 加密生成 IV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7280769/

相关文章:

r - 计算字符串中用逗号分隔的值

c++ - 为什么使用 std::vector::push_back 的 move 变体会调用 move 项的复制构造函数?

ssl - 我可以修改私钥有效性吗?

c - 向数组添加零填充

php - (Laravel) 基于用户输入的接口(interface)动态依赖注入(inject)

php - 如何检查与php中的随机字符匹配的数组数据?

r - 计算列中连续重复项的数量

javascript - 如何在 Javascript 中生成加密安全的伪随机数?

php - 如何检索18 :30:00 in php之后的记录

php - 404 错误页面的奇怪问题