【问题标题】:Yii encrypt and decrypt passwordYii加解密密码
【发布时间】:2013-08-25 20:34:02
【问题描述】:

我正在使用 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;
}

所以我的问题是如何根据密钥进行加密并每次都获得相同的值?

谢谢, 丹尼

【问题讨论】:

  • 为什么要加密密码?
  • 它是我应用程序的一部分...它不仅仅是密码,我需要这个功能
  • 但是为什么呢?这是没有意义的,即使您必须加密某些数据,也不需要每次都生成相同的输出。并且密码不应该被加密,它们应该被散列。

标签: php encryption random yii


【解决方案1】:

原则上,您每次都可以创建相同的密文。只需使用静态 IV,您就可以完成它。但是,这意味着您将泄露有关密码的信息。对于不同的用户,相同的密码将具有相同的密文。

如果您真的想拥有相同的密文,请将用户名哈希的前 16 个字节添加到密码中,并使用零 IV 进行加密。请注意,这仍然可能会及时泄漏一些有关密码的信息。

请注意,将密文值用于存储纯文本以外的其他方式通常是一个非常糟糕的主意。

【讨论】:

  • 这正是我所寻找的!!你能举一个使用零 IV 的例子吗...我找不到方法,因为它在 Yii 中是随机的
  • @DannyValariola 好吧,您只需生成这个 16 字节的字节数组,其值为 00 - 可能使用 mcrypt_enc_get_iv_size,而不是使用 mcrypt_create_iv
  • 我填充了 16Byte 并创建了一个特定于资源的加密密钥(根据您的建议),但我不明白如何更改 $this->securityManager->encrypt 它的一部分框架......或者你会扩展 CSecurityManager?
  • @DannyValariola 抱歉,我自己并不了解 Yii CSecurityManager,但扩展 CSecurityManager 听起来是个好主意。当然,只要你能确保扩展类被实际使用。
猜你喜欢
  • 2016-12-08
  • 2012-10-03
  • 2020-11-10
  • 1970-01-01
  • 2014-04-29
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
相关资源
最近更新 更多