我正在使用Yii CSecurityManager进行密码加密:
$this->securityManager->encrypt('TEST', '1');
* TEST是要加密的字符串,1是密钥。
但是当我在解密之前测试时,我发现值不断变化。
for ($index = 0; $index < 10; $index++) {
$EncPassword = $this->securityManager->encrypt('TEST', '1');
echo $EncPassword;
}
我在我的应用程序的另一部分依赖于这个值...我挖了加密密码,我发现它实际上是随机的:
public function encrypt($data,$key=null)
{
$module=$this->openCryptModule();
$key=$this->substr($key===null ? md5($this->getEncryptionKey()) : $key,0,mcrypt_enc_get_key_size($module));
srand();
$iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
mcrypt_generic_init($module,$key,$iv);
$encrypted=$iv.mcrypt_generic($module,$data);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return $encrypted;
}
所以我的问题是如何基于密钥加密并每次获得相同的值?
感谢, 丹尼
答案 0 :(得分:2)
原则上,您每次都可以创建相同的密文。只需使用静态IV,你就可以完成它。但是,这意味着您将泄露有关密码的信息。相同的密码对于不同的用户具有相同的密文。
如果你真的想拥有相同的密文,那么将用户名的哈希的前16个字节前置到密码中,并用零IV进行加密。请注意,这仍然可能会及时泄漏一些有关密码的信息。
请注意,将密文值用于除纯文本存储之外的其他方法通常是一个非常糟糕的主意。