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