2015-09-08 2 views
7

Ich habe mcrypt in meiner php app seit Jahren stark genutzt, sowohl auf win/IIS als auch auf linux. Obwohl ich PHP 5.4.28 auf meinem Linux-Server laufen lasse, habe ich gerade auf PHP 5.6.11 auf meinem Windows 8.1 IIS-Feld aktualisiert. Und Mcrypt funktioniert nicht mehr. Es wirft keine Fehler, die ich sehen kann; es funktioniert einfach nicht. Hier ist meine Verschlüsselungsfunktion:mcrypt funktioniert nicht in PHP 5.6 unter Windows/IIS

function Encrypt($text){ 
    global $salt; 
    if($text != "") 
     return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
    else 
     return ""; 
} 

Das funktioniert gut auf meinem Linux-Server, aber leer auf meinem lokalen Windows-Box. Nach dem, was ich gelesen habe, ist mcrypt in PHP 5.6 für Windows eingebaut, also sollte man nicht mit Extensions oder Ini-Dateien herumhantieren.

Was fehlt mir?

+0

Kann ich '' dev/urandom'' nicht verwenden? – ScottMcGready

+0

Getestet mit PHP 5.6.12 unter Windows 8 und es funktioniert ... kann es nicht so einfach sein wie dein '$ text' leer ist? habe versucht, 'var_dump ($ text)' '? –

+0

Ich hoffe, Sie erkennen, wie unsicher diese 'Verschlüsseln' Funktion ist. –

Antwort

5

PHP 5.6 hat stärkere Verschlüsselungsanforderungen als 5.4. In 5.6 werden Sie diese Warnung erhalten, die wirklich ein Fehler ist, weil es Verschlüsselungen und Entschlüsselungen tatsächlich verursacht scheitern:

Warnung: mcrypt_encrypt(): Schlüssel der Größe xx nicht durch diesen Algorithmus unterstützt. Nur Tasten der Größen 16, 24 oder 32 werden unterstützt.

... wobei "xx" die Länge Ihres Salzwerts ist. Daher muss der Salt-Wert genau 16, 24 oder 32 Zeichen lang sein.

3

Ich habe keine Antwort, aber das ist ziemlich lang für einen Kommentar.

Es wirft keine Fehler, die ich

Haben Sie Ihre Konfiguration, dass Sie Fehler auftreten können, um zu überprüfen getestet sehen kann, wenn sie auftreten? Wenn es zurückkehrt dann ist es nicht zu einem schwerwiegenden Fehler verursacht

aber wieder leer auf meinem lokalen Fenster

boxen. Daher sind die Mcrypt-Funktionen definiert. Hast du überprüft, dass die Konstanten definiert sind? Haben Sie überprüft, ob die Version von libmcrypt mit der PHP-Erweiterung übereinstimmt?

Haben Sie überprüft, dass die Eingaben für die Funktionen von mcrypt _ *() sinnvoll sind?

return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 

Auch wenn das oben genannte funktioniert, ist es ein schreckliches Stück Code. Der Grund für das Schreiben von Code und Hochsprachen verwenden, ist nicht so Ihr Computer sie verstehen kann, aber so Menschen den Code verstehen können:

$iv=mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
$encypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB 
       , $iv, MCRYPT_RAND); 
$encoded=base64_encode($encrypted); 
return $encoded; 

(Verlegung auch so Ihren Code aus macht es einfacher, überprüft zu injizieren, Breakpoints und andere Debugging-Maßnahmen).

+0

"Der Grund für das Schreiben von Code und die Verwendung von Hochsprachen ist nicht so, dass Ihr Computer sie verstehen kann, sondern so dass Menschen den Code verstehen können" == Zitat des Tages. – sitilge

8

Schauen wir uns Ihren Code Stück für Stück an. (Mit meist kosmetischen/Änderungen in Leerzeichen.)

function Encrypt($text) 
{ 
    global $salt; // Why not make this a second parameter? 
    if($text != "") { // An unusual check, for sure 
     return trim(// base64_encode doesn't leave whitespace 
      base64_encode(
       mcrypt_encrypt(
        MCRYPT_RIJNDAEL_256, // This is a non-standard variant of the 
             // Rijndael cipher. You want to use the 
             // MCRYPT_RIJNDAEL_128 constant if you 
             // wanted to use AES here. 
        $salt, // This is a key, not a salt! 
        $text, 
        MCRYPT_MODE_ECB, // ECB mode is the worst mode to use for 
            // cryptography. Among other reasons, it 
            // doesn't even use the IV. Search for 
            // ECB penguins for an idea of why ECB 
            // mode is such a bad idea. 
        mcrypt_create_iv(
         mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), 
         MCRYPT_RAND // You're using ECB mode so this is a waste 
            // anyway, but you should use 
            // MCRYPT_DEV_URANDOM instead of MCRYPT_RAND 
        ) 
       ) 
      ) 
     ); 
    } 
    return ""; 
} 

würde ich empfehlen, dass Sie diese Funktion nicht für alles verwenden. Es ist nicht sicher. Don't use ECB mode.

Ferner unauthenticated encryption is dangerous und libmcrypt is abandonware.

+0

Scott, wenn du mir nach all deinen Empfehlungen ein funktionierendes Beispiel geben kannst, werde ich dir das Kopfgeld geben, falls dir das etwas ausmachen sollte. – HerrimanCoder

+0

Ja, das ist einfach. Verwende [defuse/php-encryption] (https://github.com/defuse/php-encryption) anstatt deine eigene zu schreiben. –

+0

Hmmm ... mit encr libs inklusive w/php ist nicht gerade mein eigenes schreiben. Auch meine Webapp ist nicht Bankwesen oder nationale Sicherheit ... nur Sport Refs überprüft ihren Zeitplan. – HerrimanCoder

0

Wie SweatCoder angegeben vor, Ihren Schlüssel für MCRYPT_RIJNDAEL_256 eine Länge von 32 haben muss, mit zu arbeiten Ihre alten Schlüssel kleiner als 32 ist (hier $ OLDKEY genannt) verwenden

$key = str_pad($oldkey, 32, chr(0)); 

($ key ist was hast du $ salt genannt)