Класс шифрования и mcrypt_create_iv медленно
У меня проблема с моим классом шифрования. Время от времени это очень быстро. Иногда это происходит медленно. использование кода Im выглядит следующим образом
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;
}
}
Есть ли какие-либо предложения о том, почему это может быть медленным в разы и как я могу это исправить?
Ответы
Ответ 1
Вы пробовали три разных аргумента для mcrypt_create_iv()
: MCRYPT_RAND
(генератор случайных чисел системы), MCRYPT_DEV_RANDOM
(чтение данных из /dev/random ) и MCRYPT_DEV_URANDOM
(чтение данных из /dev/urandom )? Они предлагают разные постоянные скорости? Интересно, это потому, что /dev/random (случайный источник по умолчанию) заканчивается из собранной энтропии; функция будет блокироваться, когда это произойдет.
Ответ 2
Используйте MCRYPT_DEV_URANDOM при создании IV. Он менее безопасен, но не блокируется, если энтропия становится слишком низкой. 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.
Ответ 3
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;
}
}