我正忙于为我的框架设计一个用户身份验证类,我目前使用的是前段时间从教程中获得的代码。与大多数程序员一样,我觉得我需要了解代码的作用并希望对其进行修改以使其更安全。我发现下面的版本在 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 个盐字符串,这样即使有一个安全桥并且有人获得了用户盐,他们仍然需要位于文件中的盐。
我希望在不支持某些功能或算法的不同平台出现问题的情况下,最大限度地利用现实的安全性。
这是安全的和/或我应该使用不同的方法吗?