Derzeit haben wir eine Mcrypt-Implementierung auf unseren Systemen, um einige sensible Daten in unserer PHP-Anwendung zu verschlüsseln. Jetzt haben wir eine neue Anforderung, dass wir das Crypt-Modul in openssl ändern müssen. Eine andere wichtige Sache ist, dass wir die Chiffre Blowfish und den Modus ecb verwenden. Also fing ich an zu testen, was Unterschiede sind und wie ich mcrypt verschlüsselte Strings mit openssl entschlüsseln kann.
Ich habe die Standard-PHP-Funktion verwendet:
- mcrypt_encrypt vs. openssl_encrypt
- mcrypt_decrypt vs. openssl_decrypt
Beide Methoden liefern unterschiedliche Ergebnisse. Zweitens sind in der angegebenen Chiffre (Blowfish) und im Modus (ECB) in beiden Typen unterschiedliche IV-Längen erforderlich (openssl=0 und mcrypt=56).
Weiß jemand, wie ich ohne großen Migrationsaufwand die Module einfach wechseln kann?
Vielen Dank im Voraus!
AKTUALISIEREN:
Hier ist der Code, den ich getestet habe:
<?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);
Und das ist mein Ergebnis:
= 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
Vielleicht jetzt schon Ideen?
Danke!
Sie müssen entweder ein Migrationsskript ausführen, das die aktuellen Daten mit mcrypt entschlüsselt und sie dann erneut mit openssl verschlüsselt, oder Sie müssen eine Methode implementieren, mit der Sie wissen, welche Verschlüsselungs-/Entschlüsselungsfunktionen für jedes Element von verwendet werden müssen Daten, und ändern Sie sie nach Bedarf von mcrypt in openssl, wenn Sie das nächste Mal auf einige mit mcrypt verschlüsselte Daten zugreifen.
– Jon
22. August 2012 um 14:04 Uhr
So wie ich es verstehe, verwenden mcrypt und open_ssl unterschiedliche Schlüsselableitungsmethoden, und Jon hat also Recht, Sie müssen entweder migrieren, indem Sie entschlüsseln und dann verschlüsseln oder Daten markieren, damit sie beim nächsten Zugriff migriert werden.
– Reid Johnson
31. Oktober 2012 um 17:13 Uhr
Ich frage mich, warum IB im ECB-Modus erforderlich ist. Siehe die Beschreibung des ECB-Modus unter en.wikipedia.org/wiki/Block_cipher_modes_of_operation.
– doptimusprime
6. April 2013 um 3:39 Uhr
Siehe auch Upgrade meiner Verschlüsselungsbibliothek von Mcrypt auf OpenSSL und Vorbereitung auf das Entfernen von Mcrypt in PHP 7.2
– jww
21. April 2017 um 17:49 Uhr