класс шифрования и mcrypt_create_iv медленно

У меня проблема с моим классом шифрования. Время от времени это очень быстро. Иногда это происходит медленно. код Im используется следующим образом

class Cipher { private $securekey, $iv; function __construct() { $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/!2s02Uh46vuT4l7sc7a@cZ27Q',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; } } 

Есть ли какие-либо предложения о том, почему это может быть медленным в разы и как я могу это исправить?

Вы пробовали три разных аргумента для mcrypt_create_iv() : MCRYPT_RAND (генератор системных случайных чисел), MCRYPT_DEV_RANDOM (чтение данных из / dev / random) и MCRYPT_DEV_URANDOM (чтение данных из / dev / urandom)? Они предлагают разные постоянные скорости? Интересно, это потому, что / dev / random (случайный источник по умолчанию) заканчивается из собранной энтропии; функция будет блокироваться, когда это произойдет.

При создании IV используйте MCRYPT_DEV_URANDOM. Он менее безопасен, но не будет блокироваться, если энтропия станет слишком низкой. MCRYPT_DEV_RANDOM будет ждать, пока достаточная энтропия не будет приобретена для обеспечения безопасности.

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

Но в более обновленных версиях PHP значение по умолчанию изменилось, и ваш исходный код должен работать.

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

PHP docs: mcrypt_create_iv (примечание к параметру $ source) :

Обратите внимание, что значением по умолчанию для этого параметра было MCRYPT_DEV_RANDOM до PHP 5.6.0.

И из руководства Ubuntu :

Если вы не уверены в том, следует ли использовать / dev / random или / dev / urandom, то, вероятно, вы хотите использовать последнее. Как правило, / dev / urandom следует использовать для всего, кроме долгоживущих ключей GPG / SSL / SSH.

 class Cipher { private $securekey, $iv; function __construct() { $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/!2s02Uh46vuT4l7sc7a@cZ27Q',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; } }