繁体   English   中英

如何只加载一次函数并将返回值存储在变量中?

[英]How can I load a function just once and store the return in a variable?

我目前正在查看用户注册码。 我现在关注的部分是密码哈希部分。

我要做的是从配置文件中获取static_salt,并使用mt_rand()生成dynamic_salt。 我想要做的是将这个dynamic_salt存储在我的数据库中。

但是,如果我将dynamic_salt()方法传递给create方法,以便将其发送到数据库中某个表的salt列,它将再次运行该方法,并创建与hashed()方法产生的结果不同的结果。

实现我想要达到的目标的最佳方法是什么,如果可以,请给我一个例子吗?

public function create() {

                $dbcolumn->password = $this->hashed();
                $dbcolumn->salt = $this->dynamic_salt;
                $this->db->insert('users', $dbcolumn);

    }

public function dynamic_salt() {

            $get_dynamic_salt = mt_rand();
            return $get_dynamic_salt;
}

public function hashed() { //hashing method, that also makes
            // sha1 and salt password
            $static_salt = $this->config->item('encryption_key'); //grab static salt from config file
            $dynamic_salt = $this->dynamic_salt();

        $password = $this->encrypt->sha1($this->input->post('password')); //encrypt user password
            $hashed = sha1($dynamic_salt . $password . $static_salt);

            return $hashed;
}

我建议您不要使用动态盐,因为它会降低应用程序的灵活性,并且可能无法以当前形式运行。

的目的是防止有人获得您的用户数据库时可以进行的字典攻击 在这方面,静态盐绝对是在您的应用程序中实现的一个好主意。

向每个用户添加动态盐将意味着您将必须命中数据存储以检索动态盐和用户密码的哈希版本,然后,您将必须执行CPU密集型哈希功能(在您的代码中,两次-您正在对安全性较低且更可能发生冲突的哈希进行哈希处理)。

具有简单的已知静态盐和哈希密码,将使您可以在应用程序增长时使用键/值存储系统(例如memcache) 将用户标识存储为密钥,将用户哈希密码存储为值,您将拥有一个快速的身份验证系统。

尝试这个:

public function dynamic_salt() {
    if(!isset($this->dyn_salt))
       $this->dyn_salt = mt_rand();
    return $this->dyn_salt;
}

如果dyn_salt实例变量尚不存在,它将为它分配mt_rand()的结果,否则它将仅返回先前的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM