密码类和mcrypt_create_iv有时很慢

bre*_*rer 11 php encryption mcrypt

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Cro*_*tab 26

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

  • @ Silver89:只需更改为"MCRYPT_DEV_URANDOM".根据Bruce Schneier的说法,/ dev/random和/ dev/urandom都不是非常强大(https://www.schneier.com/blog/archives/2013/10/insecurities_in.html),所以你不妨使用一个这样可行. (2认同)

ric*_*mer 6

创建IV时使用MCRYPT_DEV_URANDOM.它不太安全,但如果熵太低则不会阻止.MCRYPT_DEV_RANDOM将等到获得足够的熵以确保安全.

// PHP < 5.6
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM);
Run Code Online (Sandbox Code Playgroud)

但在PHP的更新版本中,默认值已更改,您的原始代码应该可以正常工作.

// PHP >= 5.6
$this->iv = mcrypt_create_iv(32);   // MCRYPT_DEV_URANDOM implied
Run Code Online (Sandbox Code Playgroud)

PHP文档:mcrypt_create_iv (注意$ source参数):

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

Ubuntu手册:

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