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

时间:2010-12-28 04:56:26

标签: php mysql class function codeigniter

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

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

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

实现我想要实现的目标的最佳途径是什么,如果可能的话,你能告诉我一个例子吗?

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;
}

2 个答案:

答案 0 :(得分:2)

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

salt的目的是防止某人在获得您的用户数据库时可以做的dictionary attacks。在这方面,静态盐绝对是在您的应用程序中实现的好主意。

为每个用户添加动态salt意味着您必须访问数据存储区以检索动态salt和用户密码的散列版本,然后您必须执行CPU密集型散列函数(在您的代码中,两次 - 您正在散列一个安全性较低且更容易发生冲突的哈希值。

如果应用程序增长,使用简单的已知,静态salt和散列密码将允许您使用memcache之类的键/值存储系统。将用户标识存储为密钥,并将用户哈希密码存储为值,您将拥有一个快速认证系统。

答案 1 :(得分:1)

试试这个:

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

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