2012-06-06 19 views
11

Tengo un problema con mi clase de cifrado. A veces es muy rápido. A veces, sin embargo, es lento. el código Im usando es el siguienteclase de cifrado y mcrypt_create_iv es lento en los momentos

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

¿Hay alguna sugerencia sobre por qué esto puede ser lento a veces y cómo podría solucionar este problema?

+0

¿Cómo es la carga del servidor cuando se ejecuta rápidamente? Cuando se ejecuta lento? ¿Qué tipo de veces has grabado? – Crontab

+0

Las cargas del servidor han sido idénticas entre rápido/lento cuando es rápido, se carga en aproximadamente .5 segundos cuando es lento, puedo esperar durante aproximadamente 2 minutos – bretterer

+0

Solo una nota de seguridad: creo que está utilizando su clase de cifrado para encriptar texto claro múltiple. Normalmente, un IV no debe reutilizarse, por lo que es mejor generar el IV en el método de cifrado en lugar del constructor. Consulte http://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt para ver cómo almacenarlo y restaurarlo. Además, tenga en cuenta que mcrypt_create_iv puede ser muy lento si el sistema no tiene suficiente entropía. Personalmente utilizo openssl_random_pseudo_bytes. Además, creo que falta el argumento iv en tus llamadas de función mcrypt_encrypt/decrypt. –

Respuesta

26

¿Ha probado los tres segundos argumentos diferentes para mcrypt_create_iv(): MCRYPT_RAND (generador de números aleatorios del sistema), MCRYPT_DEV_RANDOM (leer datos de/dev/random) y MCRYPT_DEV_URANDOM (leer datos de/dev/urandom)? Ofrecen diferentes velocidades consistentes? Me pregunto si es porque/dev/random (la fuente aleatoria predeterminada) se está quedando sin entropía recopilada; la función se bloqueará cuando lo haga.

+0

Si es el último, ¿hay alguna solución para esto o deberíamos simplemente cambiar a 'MCRYPT_DEV_URANDOM'? – Dan

+2

@ Silver89: simplemente cambie a 'MCRYPT_DEV_URANDOM'. Según Bruce Schneier, ni/dev/random ni/dev/urandom son muy robustos (https://www.schneier.com/blog/archives/2013/10/insecurities_in.html), así que es mejor que utilices uno eso funciona. – Crontab

+0

Utilicé 'MCRYPT_RAND' que funcionó. 'MCRYPT_DEV_URANDOM' también funcionó. –

-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

¿Qué cambiaste? – Nightfirecat

+1

Nunca es una buena idea reutilizar un IV, tendrá un impacto negativo en la seguridad. – Sam

6

Utilice MCRYPT_DEV_URANDOM al crear el IV. Es menos seguro, pero no se bloqueará si la entropía es demasiado baja. MCRYPT_DEV_RANDOM esperará hasta que se haya adquirido suficiente entropía para estar seguro.

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

Pero en las versiones más actualizadas de PHP, el valor predeterminado ha cambiado y su código original debería funcionar.

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

PHP docs: mcrypt_create_iv(nota sobre el parámetro de origen $):

Tenga en cuenta que el valor predeterminado de este parámetro fue MCRYPT_DEV_RANDOM antes de PHP 5.6.0.

Y desde Ubuntu Manual:

Si no está seguro acerca de si debe usar/dev/random o/dev/urandom, entonces probablemente usted desea utilizar este último. Como regla general,/dev/urandom se debe usar para todo excepto para las claves GPG/SSL/SSH de vida larga.

+1

Este sentimiento se repite y se amplía en el [Manual de Ubuntu] (http://manpages.ubuntu.com/manpages/lucid/man4/random.4.html) - y cito: "Si no está seguro de si debería usar/dev/random o/dev/urandom, entonces probablemente quiera usar el último. Como regla general,/dev/urandom debe usarse para todo, excepto para las claves GPG/SSL/SSH de vida larga ". –