3

我正在encode()从 Encrypt 类中做一个,每次它为相同的输入字符串返回一个不同的字符串。我的application/config/encrypt.php

return array(
    'default' => array(
        /**
         * The following options must be set:
         *
         * string   key     secret passphrase
         * integer  mode    encryption mode, one of MCRYPT_MODE_*
         * integer  cipher  encryption cipher, one of the Mcrpyt cipher constants
         */
        'cipher' => MCRYPT_RIJNDAEL_128,
        'key'    => 'df58e28f',
        'mode'   => MCRYPT_MODE_NOFB,
    ),
);

采用:

$str = Encrypt::instance()->encode('test');

$str总是有不同的价值。这是一个错误还是应该以这种方式工作?为什么?

此外,我必须补充一点,我始终可以decode()使用该值并test每次都获取字符串。

更新:这是一个示例输出:0vahDa/2Qu3XQWObkjwLPoL73g==

非常感谢你。

4

2 回答 2

2

每次都不同的原因是什么时候encode()被称为新的随机IV用于加密数据。这是执行此操作的行:

// Create a random initialization vector of the proper size for the current cipher
$iv = mcrypt_create_iv($this->_iv_size, Encrypt::$_rand);

然后它最终返回一个由加密数据IV 组成的 base 64 编码字符串。

// Use base64 encoding to convert to a string
return base64_encode($iv.$data);

这是故意的行为,并不是一件坏事。正如您所指出的,您总是会得到相同的未加密数据 - 所以它正在做它的工作。

于 2013-02-01T10:29:20.010 回答
1

其实这是故意的行为。

恕我直言,这样加密更安全。大多数伪黑客会认为不同的加密值意味着不同的实际值。

重要的是你在解密时总是得到相同的值。

你必须小心:当你想两次使用相同的加密字符串时,你应该单独存储它,因为再次加密不会产生相同的东西。

于 2012-01-06T22:48:36.230 回答