Actualmente tenemos una implementación de mcrypt en nuestros sistemas para cifrar algunos datos sensibles en nuestra aplicación PHP. Ahora tenemos un nuevo requisito de que tenemos que cambiar el módulo cripta a openssl. Otra cosa que es importante saber es que estamos usando el cifrado blowfish y el modo ecb. Así que comencé a probar cuáles son las diferencias y cómo puedo descifrar las cadenas cifradas de mcrypt con openssl.Reemplace Mcrypt con OpenSSL
I utiliza la función de PHP estándar:
- MCRYPT_ENCRYPT vs. openssl_encrypt
- MCRYPT_DECRYPT vs. openssl_decrypt
Ambos métodos están entregando resultados diferentes. Lo segundo es que en el cifrado (pez globo) y modo (ecb) dado en ambos tipos se requieren diferentes longitudes IV (openssl = 0 y mcrypt = 56).
¿Alguien sabe cómo puedo cambiar fácilmente los módulos sin tener que realizar un gran esfuerzo de migración?
¡Gracias de antemano!
ACTUALIZACIÓN:
Aquí está el código, lo que he comprobado:
<?php
function say($message){
if(!is_string($message)){
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "<pre>";
echo var_export($message, true) . ((!isset($_SERVER["HTTP_USER_AGENT"]) ? "\n" : "<br />"));
if(!isset($_SERVER["HTTP_USER_AGENT"])) echo "</pre>";
}else{
echo $message . ((!isset($_SERVER["HTTP_USER_AGENT"]) ? "\n" : "<br />"));
}
}
say("= Begin raw encryption");
$key = "anotherpass";
$str = "does it work";
say(" Params:");
say(" - String to encrypt '".$str."'");
say(" - Key: ".$key);
say("");
$params = array(
"openssl" => array(
"cipher" => "BF",
"mode" => "ECB",
),
"mcrypt" => array(
"cipher" => "blowfish",
"mode" => "ecb",
),
);
say("= Mcrypt");
$handler = mcrypt_module_open($params['mcrypt']['cipher'], '', $params['mcrypt']['mode'], '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($handler), MCRYPT_RAND);
$keysize = mcrypt_enc_get_key_size($handler);
mcrypt_generic_init($handler,$key,"\0\0\0\0\0\0\0\0");
say(" Params:");
say(" - InitVector ".bin2hex($iv)." (bin2hex)");
say(" - Max keysize ".$keysize);
say(" - Cipher ".$params['mcrypt']['cipher']);
say(" - Mode ".$params['mcrypt']['mode']);
say("");
say(" Encryption:");
$m_encrypted = mcrypt_generic($handler, $str);
$m_decrypted = mdecrypt_generic($handler, $m_encrypted);
say(" - Encrypted ".bin2hex($m_encrypted)." (bin2hex)");
say(" - Descrypted ".$m_decrypted);
say("");
say("= Openssl");
say(" Params:");
say(" - InitVector not needed");
say(" - Max keysize ".openssl_cipher_iv_length($params['openssl']['cipher']."-".$params['openssl']['mode']));
say(" - Cipher ".$params['openssl']['cipher']);
say(" - Mode ".$params['openssl']['mode']);
say("");
say(" Encryption:");
$o_encrypted = openssl_encrypt($str,$params['openssl']['cipher']."-".$params['openssl']['mode'],$key,true);
$o_decrypted = openssl_decrypt($o_encrypted,$params['openssl']['cipher']."-".$params['openssl']['mode'],$key,true);
say(" - Encrypted ".bin2hex($o_encrypted)." (bin2hex)");
say(" - Descrypted ".$o_decrypted);
y este es mi resultado:
= Begin raw encryption
Params:
- String to encrypt 'does it work'
- Key: anotherpass
= Mcrypt
Params:
- InitVector 06a184909d7bf863 (bin2hex)
- Max keysize 56
- Cipher blowfish
- Mode ecb
Encryption:
- Encrypted 0e93dce9a6a88e343fe5f90d1307684c (bin2hex)
- Descrypted does it work
= Openssl
Params:
- InitVector not needed
- Max keysize 0
- Cipher BF
- Mode ECB
Encryption:
- Encrypted 213460aade8f9c14d8d51947b8231439 (bin2hex)
- Descrypted does it work
Tal vez alguna idea ahora?
Gracias!
ya sea que usted tiene que ejecutar un script de migración que descifra los datos actuales utilizando mcrypt y lo vuelve a cifrar usando openssl, o de lo contrario' Necesitaré implementar un método mediante el cual sepas qué funciones de cifrado/descifrado usar para cada elemento de datos, y cambiarlas de mcrypt a openssl según sea necesario cuando sigas accediendo a algunos datos cifrados usando mcrypt. – Jon
Según tengo entendido, mcrypt y open_ssl usan diferentes métodos de derivación de claves y, por lo tanto, Jon tiene razón, deberá migrar por descifrado y luego cifrar o marcar datos para que se migre a medida que se acceda a ellos. –
Me pregunto por qué se requiere IB en modo ECB. Consulte la descripción del modo ECB en http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation. – doptimusprime