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%(即,无法与随机消息区分)
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()
,请看您是否正在验证密文?