2012-06-06 8 views
11

Sto riscontrando un problema con la mia classe di cifratura. A volte è molto veloce. A volte però è lento. il codice Im usando è il seguentecipher class e mcrypt_create_iv è lento a volte

class Cipher { 
    private $securekey, $iv; 
    function __construct() { 
     $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/[email protected]',TRUE); 
     $this->iv = mcrypt_create_iv(32); 
    } 
    function encrypt($input) { 
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB)); 
    } 
    function decrypt($input) { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB)); 
    } 
    function storeIV() { 
     return $this->iv; 
    } 
} 

Ci sono dei suggerimenti sul perché questo può essere lento a volte e come potrei risolvere questo problema?

+0

Come si carica il server quando viene eseguito rapidamente? Quando funziona lento? Che tipo di volte hai registrato? – Crontab

+0

I carichi del server sono stati identici tra veloce/lento quando è veloce si sta caricando in circa 0,5 secondi quando è lento, posso aspettare per circa 2 minuti – bretterer

+0

Solo una nota di sicurezza: credo che stai usando la tua classe Cipher per crittografare testo in chiaro multiplo. Normalmente un iv non dovrebbe essere riutilizzato, quindi è meglio che io pensi di generare l'IV nel metodo di crittografia piuttosto nel costruttore. Vedi http://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt per vedere come memorizzarlo e ripristinarlo. Inoltre, nota che mcrypt_create_iv può essere molto lento se il sistema non ha abbastanza entropia. Personalmente uso openssl_random_pseudo_bytes. Inoltre, penso che ci sia l'argomento iv mancante nelle tue chiamate alla funzione mcrypt_encrypt/decrypt. –

risposta

26

Hai provato le tre diverse secondo argomento per mcrypt_create_iv(): MCRYPT_RAND (sistema di generatore di numeri casuali), MCRYPT_DEV_RANDOM (leggere dati da/dev/random) e MCRYPT_DEV_URANDOM (leggere dati da/dev/urandom)? Offrono diverse velocità costanti? Mi chiedo se è perché/dev/random (la fonte casuale di default) sta esaurendo l'entropia raccolta; la funzione si bloccherà quando lo farà.

+0

Se è il secondo, c'è una soluzione per questo o dovremmo semplicemente passare a 'MCRYPT_DEV_URANDOM'? – Dan

+2

@ Silver89: passa a 'MCRYPT_DEV_URANDOM'. Secondo Bruce Schneier, né/dev/random né/dev/urandom sono molto robusti (https://www.schneier.com/blog/archives/2013/10/insecurities_in.html), quindi potresti usare anche quello che funzioni. – Crontab

+0

Ho usato 'MCRYPT_RAND' che ha funzionato. Anche 'MCRYPT_DEV_URANDOM' ha funzionato. –

-1
class Cipher { 
    private $securekey, $iv; 
    function __construct() { 
     $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/[email protected]',TRUE); 
     $this->iv = isset($_SESSION['sifrem'])?$_SESSION['sifrem']:mcrypt_create_iv(34); 
     $_SESSION['sifrem']=$this->iv; 
    } 
    function encrypt($input) { 
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB)); 
    } 
    function decrypt($input) { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB)); 
    } 
    function storeIV() { 
     return $this->iv; 
    } 
} 
+0

Cosa hai cambiato? – Nightfirecat

+1

Non è mai una buona idea riutilizzare un IV, avrà un impatto negativo sulla sua sicurezza. – Sam

6

Utilizzare MCRYPT_DEV_URANDOM durante la creazione di IV. È meno sicuro, ma non si bloccherà se l'entropia diventa troppo bassa. MCRYPT_DEV_RANDOM attenderà fino a quando non sarà acquisita abbastanza entropia per essere sicura.

// PHP < 5.6 
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM); 

Ma in versioni più aggiornate di PHP, il valore predefinito è cambiato e il codice originale dovrebbe funzionare.

// PHP >= 5.6 
$this->iv = mcrypt_create_iv(32); // MCRYPT_DEV_URANDOM implied 

PHP docs: mcrypt_create_iv(nota sul parametro sorgente $):

Si noti che il valore di default di questo parametro è stato MCRYPT_DEV_RANDOM prima di PHP 5.6.0.

E da Ubuntu Manual:

Se non si è sicuri se si deve utilizzare/dev/random o/dev/urandom, allora probabilmente si desidera utilizzare quest'ultimo. Come regola generale,/dev/urandom dovrebbe essere usato per tutto tranne le chiavi GPG/SSL/SSH longeve.

+1

Questo sentimento è echeggiato e ampliato nel [Manuale di Ubuntu] (http://manpages.ubuntu.com/manpages/lucid/man4/random.4.html) - e cito: "Se non sei sicuro di te dovrebbe usare/dev/random o/dev/urandom, quindi probabilmente si vuole usare quest'ultimo, come regola generale,/dev/urandom dovrebbe essere usato per tutto tranne le chiavi GPG/SSL/SSH longeve. " –