2015-09-08 33 views
7

Ho fatto un uso pesante di mcrypt nella mia app php per anni, sia su win/IIS che su linux. Sebbene io stia eseguendo PHP 5.4.28 sul mio server linux, ho appena effettuato l'aggiornamento a PHP 5.6.11 sulla mia finestra IIS 8.1 di Windows. E mcrypt non funziona più. Non lancia errori che riesco a vedere; semplicemente non funziona Qui è la mia funzione di crittografia:mcrypt non funziona in PHP 5.6 su 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 ""; 
} 

Questo funziona bene sul mio server Linux, ma restituisce vuota sulla mia scatola di finestre locali. Da quello che ho letto, mcrypt è integrato in php 5.6 per Windows, quindi non ci dovrebbe essere alcun giochetto con estensioni o file ini.

Cosa mi manca?

+0

Non mcrypt usa '/ dev/urandom'? – ScottMcGready

+0

Testato con PHP 5.6.12 su Windows 8 e funziona ... non è così semplice come il tuo '$ text' è vuoto? hai provato a 'var_dump ($ text)'? –

+0

Spero ti renderai conto di quanto sia insicura la funzione 'Encrypt'. –

risposta

5

PHP 5.6 ha requisiti di crittografia più elevati di 5.4. In 5.6 si otterrà questo avvertimento, che in realtà è un errore perché provoca in realtà crittografie e decodifiche a fallire:

Attenzione: mcrypt_encrypt(): Chiave di dimensioni XX non supportato da questo algoritmo. Sono supportate solo le chiavi delle dimensioni 16, 24 o 32.

... dove "xx" è la lunghezza del valore di sale. Quindi il valore di sale deve essere esattamente di 16, 24 o 32 caratteri di lunghezza.

3

Non ho una risposta, ma questo è piuttosto lungo per un commento.

Non buttare gli eventuali errori che posso vedere

Avete provato la configurazione per verificare che sia possibile a vedere gli errori quando si verificano?

ma restituisce vuoto sul mio Windows locali box

Se è tornare allora non sta causando un errore fatale. Quindi le funzioni di mcrypt sono definite. Hai controllato che le costanti siano definite? Hai controllato che la versione di libmcrypt corrisponda al requisito dell'estensione PHP?

Avete controllato che gli ingressi alle funzioni mcrypt _ *() siano sensibili?

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

Anche se il precedente ha funzionato, è un bit di codice orribile. La ragione per la scrittura di codice e l'utilizzo di linguaggi di alto livello non è così il computer li può capire, ma così gli esseri umani possono capire il codice:

$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; 

(che stabilisce il codice come questo rende anche più semplice per iniettare i controlli, i punti di interruzione e altre misure di debug).

+0

"La ragione per scrivere codice e usare linguaggi di alto livello non è così che il tuo computer può capirli ma così gli esseri umani possono capire il codice" == citazione del giorno. – sitilge

8

Diamo un'occhiata al codice pezzo per pezzo. (Con lo più cosmetici modifiche/spazi bianchi.)

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 ""; 
} 

vi consiglio vivamente di non utilizzare questa funzione per qualsiasi cosa. Non è sicuro Don't use ECB mode.

Inoltre, unauthenticated encryption is dangerous e libmcrypt is abandonware.

+0

Scott, se puoi darmi un esempio funzionante in base a tutti i tuoi consigli, ti assegnerò la taglia, nel caso ti interessi. – HerrimanCoder

+0

Sì, è facile. Usa [defuse/php-encryption] (https://github.com/defuse/php-encryption) invece di scriverne uno tuo. –

+0

Hmmm ... utilizzando le librerie encr incluse w/php non sta scrivendo esattamente le mie. Anche la mia webapp non è bancaria o di sicurezza nazionale ... solo refs sportivi che controllano il loro programma. – HerrimanCoder

0

Come SweatCoder detto prima, la chiave per MCRYPT_RIJNDAEL_256 deve avere una lunghezza di 32. Per continuare a lavorare con la vecchia chiave essendo più piccolo di 32 (qui chiamato $ OldKey) usa

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

(tasto $ è quello che hai chiamato $ sale)