フレームワークのユーザー認証クラスで忙しく、現在は少し前にチュートリアルから入手したコードを使用しています。ほとんどのプログラマーと同様に、コードが何をするのかを理解する必要があり、より安全になるようにコードを変更したいと考えています。以下のバージョンでは 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 つのソルト文字列を使用しようとしています。
特定の機能やアルゴリズムをサポートしていないさまざまなプラットフォームで問題が発生することなく、現実的なセキュリティを最大限に活用したいと考えています。
これは安全ですか、または別の方法を使用する必要がありますか?