php - tipos - ¿Cómo generar de forma segura un IV para el cifrado AES CBC?
como hacer un algoritmo de cifrado (3)
Trabajo en algunas cosas crypto.
- Uso AES 256 con modo CBC
- Yo uso OPENSSL
Soy consciente de las siguientes cosas (fuente = wikipedia):
un vector de iniciación debe ser:
- Único: no debe repetirse para ningún mensaje cifrado con una clave determinada
- Impredecible: un atacante que observa cualquier número de mensajes y sus IV no deberían tener información para predecir el siguiente con probabilidad de éxito superior al 50% por bit (es decir, indistinguible del azar)
Mi pregunta es, ¿cómo generar de forma segura IV con OPENSSL y PHP? Sé que hay una funcionalidad semejante en lib mcrypt ( http://fr2.php.net/manual/fr/function.mcrypt-create-iv.php )
No encontré nada para hacer esto con OPENSSL (generando IV único e impredecible).
Puede usar openssl_random_pseudo_bytes (len, & crypto_stron) .
El primer parámetro es la longitud que desea en bytes. Si está utilizando esto para utilizarlo en uno de los métodos abiertos de SSL, puede usar la función openssl_cipher_iv_length (método) para obtener la longitud correcta del método utilizado.
El segundo parámetro, & crypto_strong, le permite pasar una variable booleana que se establecerá en verdadero o falso, dependiendo de si el algoritmo utilizado fue criptográficamente seguro. Luego puede verificar esta variable y manejarla correctamente si la variable vuelve a ser falsa. Nunca debería suceder, pero si lo hace, probablemente querrás saberlo.
Aquí hay un ejemplo de uso adecuado:
$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.");
Para más información, ver:
Simplemente más cómodo de usar las mismas cosas que Thomas sujested:
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;
}
Use openssl_random_pseudo_bytes
(más preferiblemente con el segundo parámetro establecido en una variable existente, que luego debe probar que se estableció en TRUE
). Esto generará IVs con características de aleatoriedad apropiadas.
$wasItSecure = false;
$iv = openssl_random_pseudo_bytes(16, $wasItSecure);
if ($wasItSecure) {
// We''re good to go!
} else {
// Insecure result. Fail closed, do not proceed.
}
Alternativamente, PHP 7 ofrece random_bytes()
que es mucho más simple.