密码类和mcrypt_create_iv有时很慢

时间:2012-06-06 14:24:54

标签: php mcrypt encryption

我的密码课有问题。有时它非常快。但有时它很慢。我使用的代码如下

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

对于为什么有时这可能会很慢以及如何解决这个问题,有什么建议吗?

3 个答案:

答案 0 :(得分:26)

您是否尝试了mcrypt_create_iv()的三个不同的第二个参数:MCRYPT_RAND(系统随机数生成器),MCRYPT_DEV_RANDOM(从/ dev / random读取数据)和MCRYPT_DEV_URANDOM (从/ dev / urandom读取数据)?它们提供不同的一致速度吗?我想知道是不是因为/ dev / random(默认的随机源)用完了收集的熵;该功能将在此时阻止。

答案 1 :(得分:6)

创建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参数)

  

请注意,此参数的默认值为PHP 5.6.0之前的MCRYPT_DEV_RANDOM。

来自Ubuntu Manual

  

如果您不确定是否应该使用/ dev / random或/ dev / urandom,那么可能您想使用后者。作为一般规则,/ dev / urandom应该用于除长期GPG / SSL / SSH密钥之外的所有内容。

答案 2 :(得分:-1)

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