У меня проблема с моим классом шифрования. Время от времени это очень быстро. Иногда это происходит медленно. код 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; } }