Remplacez Mcrypt par OpenSSL

actuellement, nous avons un mcrypt implentation sur nos systèmes à la crypte de certaines données sensibles dans notre application PHP. Nous avons maintenant une nouvelle exigence que nous devons changer la crypte module openssl. Une autre chose qui est important à savoir, c'est que nous sommes à l'aide de l'algorithme de chiffrement blowfish et de la mode de la bce. J'ai donc commencé à tester quelles sont les différences et comment je peux déchiffrer mcrypt des chaînes cryptées avec openssl.

J'ai utilisé le standard de la fonction PHP:

  • mcrypt_encrypt vs openssl_encrypt
  • mcrypt_decrypt vs openssl_decrypt

Les deux méthodes sont la livraison des résultats différents. Deuxième chose, c'est que dans le code (blowfish) et mode (bce) dans les deux types différents IV longueurs sont nécessaires (openssl=0 et mcrypt=56).

Quelqu'un sait comment je peux changer facilement les modules sans avoir un gros effort de migration?

Merci d'avance!

Mise à JOUR:

Voici le code, je l'ai testé:

<?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);

Et voici mon résultat:

= 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

Peut-être des idées maintenant?

Merci!

source d'informationauteur maTu