Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何安全地为AES CBC加密生成IV?_Php_Vector_Cryptography_Openssl - Fatal编程技术网

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

Php 如何安全地为AES CBC加密生成IV?,php,vector,cryptography,openssl,Php,Vector,Cryptography,Openssl,我在做一些加密的东西 我在CBC模式下使用AES 256 我使用OPENSSL 我知道以下事情(来源=维基百科): 初始化向量应为: 唯一:对于使用给定密钥加密的任何消息,不得重复 不可预测:观察任意数量的消息及其IVs的攻击者不应具有预测下一条消息的信息,且成功概率大于每比特50%(即,无法与随机消息区分) 我的问题是,如何使用OPENSSL和PHP安全地生成IV?我知道lib mcrypt()中有这样一个函数性 我在OPENSSL(生成唯一且不可预测的IV)中找不到这样做的任何方法。

我在做一些加密的东西

  • 我在CBC模式下使用AES 256
  • 我使用OPENSSL
我知道以下事情(来源=维基百科):

初始化向量应为:

  • 唯一:对于使用给定密钥加密的任何消息,不得重复
  • 不可预测:观察任意数量的消息及其IVs的攻击者不应具有预测下一条消息的信息,且成功概率大于每比特50%(即,无法与随机消息区分)
我的问题是,如何使用OPENSSL和PHP安全地生成IV?我知道lib mcrypt()中有这样一个函数性

我在OPENSSL(生成唯一且不可预测的IV)中找不到这样做的任何方法。

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

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

或者,PHP7提供了更简单的功能。

您可以使用openssl\u random\u pseudo\u bytes(len,&crypto\u stron)

第一个参数是所需的长度(以字节为单位)。如果您在其中一种开放ssl方法中使用此函数,则可以使用函数openssl\u cipher\u iv\u length(method)获取所用方法的正确长度

第二个参数&crypto_strong允许您传入一个布尔变量,该变量将根据所使用的算法是否加密安全而设置为true或false。然后,您可以检查该变量,如果该变量返回false,则可以正确处理该变量。这不应该发生,但如果发生了,你可能会想知道

以下是正确使用的示例:

$method = 'aes-256-cbc';
$ivlen = openssl_cipher_iv_length($method);
$isCryptoStrong = false; // Will be set to true by the function if the algorithm used was cryptographically secure
$iv = openssl_random_pseudo_bytes($ivlen, $isCryptoStrong);
if(!$isCryptoStrong)
    throw new Exception("Non-cryptographically strong algorithm used for iv generation. This IV is not safe to use.");
有关更多信息,请参阅:


使用托马斯·苏克开玩笑说的东西更舒服:

private function genIv()
{
    $efforts = 0;
    $maxEfforts = 50;
    $wasItSecure = false;

    do
    {
        $efforts+=1;
        $iv = openssl_random_pseudo_bytes(16, $wasItSecure);
        if($efforts == $maxEfforts){
            throw new Exception('Unable to genereate secure iv.');
            break;
        }
    } while (!$wasItSecure);

    return $iv;
}

如何确定IVs的适当长度?请注意,openssl_random_pseudo_bytes的第二个可选参数是对变量的引用。当生成的字符串被视为“加密性强”时,其值由openssl设置。请看正确的。第二个参数通过引用传递,并且仅当所使用的算法加密性强时,调用后才包含true。请看下面我的答案,并给出一个示例和正确用法。注意:在PHP7中,最好只使用
random\u bytes()
。它比OpenSSL更可靠(可能更安全)。@foochow也许您正在寻找
OpenSSL\u cipher\u iv\u length()
,请看您是否正在验证密文?