Класс шифрования и 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;
    }
}