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
Vous devez vous connecter pour publier un commentaire.
Blowfish est l'algorithme de chiffrement par bloc. Il exige que les données à être complétées avant le chiffrement.
OpenSSL utilise le fichier PKCS#7 et mcrypt utilise le fichier PKCS#5. Différents rembourrage algorythms pour les données.
Minimes PKCS#5 rembourrage longueur est de 0, PKCS#7, c'est 1 (wikipedia). Jetez un oeil à cet exemple (j'ai manuellement collier de données d'entrée pour
mcrypt_encrypt()
dans PKCS#7 style):Il est impossible de openssl_decrypt() les données chiffrées avec mcrypt_encrypt(), à moins que le manuel des données de rembourrage a été faite avec PKCS#7 avant
mcrypt_encrypt()
a été appelé.Il n'y a qu'une seule façon dans votre cas recrypt les données.
PS: Il y a une erreur dans votre code source de la BCE mode n'utilise IV (wikipedia)
Plus courtes, les clés, vous devez faire de vélo clés pour openssl lors de la migration de mcrypt de blowfish.
Voir: https://bugs.php.net/bug.php?id=72362
Voir: Le déplacement de mcrypt avec Blowfish & de la BCE à OpenSSL
Dans le cas où vous souhaitez crypter avec openssl et encore obtenir le même résultat que si vous aviez chiffré avec mcrypt lors du déchiffrement avec mcrypt, vous devez manuellement null-pad de la chaîne d'entrée avant de les crypter avec openssl_encrypt et passer le
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
options.Déchiffrer avec mcrypt_decrypt fonctionnera alors comme si vous aviez également utilisé mcrypt pour le chiffrement.
@clover est un droit que le défaut de rembourrage pour Blowfish est différente entre mcrypt et d'Openssl, mais il est faux qu'il ne peut pas être fait. Si vous utilisez le
OPENSSL_ZERO_PADDING
option pour le déchiffrer les deux sont réellement compatibles: