我目前正在查看我的用户注册码。我现在关注的部分是密码散列部分。
我所做的是从配置文件中获取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;
}
答案 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()
的结果,否则它将返回之前的值。