数据库的安全用户密码哈希

时间:2013-04-09 16:53:28

标签: php crypt

我忙于为我的框架提供用户身份验证类,我目前使用的是我刚刚从教程中获得的代码。与大多数程序员一样,我觉得我需要了解代码的作用,并希望将其修改为更安全。我发现下面的版本在Mac上失败,所以我需要重写它。这是我在我的身份验证类中的先前方法(用于注册帐户:

 // security is a config file with a global salt in $security->security_salt
 public function generate_crypt($password) {
    $security = new security();
    $crypt_salt = '$6$rounds=5000$' . uniqid() . "$";
    $password = $password . $security->security_salt;
    return crypt($password, $crypt_salt);
}

现在上面的例子只使用了1个全局盐,我觉得如果每个用户都有一个单独的盐会更好,所以有效地我想把它改成:

/*
 * properties below are from methods, I am just putting it as
 * seperate variables to be understood a little better:
 *
 */

 private function generate_user_salt() {
       return hash('sha512',uniqid());
 }

 private function generate_crypt($password, $user_salt) {
    $security = new security_config();
    $password = $password . $security->security_salt;
    return crypt($password, $user_salt);
}

private register() {
      $user_salt = $this->generate_user_salt();
      $password = $this->generate_crypt($_POST['password'],$user_salt);
      // Write user to database where `salt`=>$user_salt and `password`=>$password;
}

要进行身份验证,我会这样做:

 // Data is retrieved from database and stored in a $this->credentials array property:
 private function validate_password() {
    $security = new security_config();
    $salted_password = $_POST['password'] . $security->security_salt;
    if (crypt($salted_password, $this->credentials['salt']) == $this->credentials['password']) {
        return true;
    }
}

我已经测试了上面的内容,它似乎工作正常,但是,这是使用crypt()的正确方法,它是否安全?我试图使用2个盐串,这样即使有一个安全桥并且有人获得了用户盐,他们仍然需要位于文件中的盐。

我希望利用最大量的实际安全性,而不会在不同平台上出现不支持某些功能或算法的问题。

这样安全和/或我应该使用不同的方法吗?

0 个答案:

没有答案