Я хочу хранить (случайную) соль рядом с паролем в базе данных. Теперь вопрос:
Стоит ли хранить его в хеше или в виде простого текста? Есть ли разница (больше безопасности, быстрее?)? Сколько усилий я должен приложить для создания случайной строки?
Пример кода:
//Creating random salt
$saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&()*+,-./:;<=>?@[]^_`{|}~";
$salt = uniqid(rand(), true).str_shuffle($saltchars);
// Or should the salt be hashed (md5 or sha512 for more security)
// $salt = hash('sha512', uniqid(rand(), true).$staticsalt.str_shuffle($saltchars));
//Create user (with salt & pepper)
$sqlquery = "INSERT INTO users (user, password, salt) VALUES('$id','".hash('sha512', $staticsalt.$accesskey.$salt)."','".$salt."');";
$sqlresult = mysql_query($sqlquery);
для записи: логин-скрипт
$sqlquery = "SELECT salt FROM users WHERE user='$id';";
$sqlresult = mysql_query($sqlquery);
if (mysql_num_rows($sqlresult) == 1) {
$salt = (mysql_fetch_array($sqlresult));
//Check if the password is correct
$sqlquery = "SELECT * FROM users WHERE user='$id' AND password='".hash('sha512', $staticsalt.$accesskey.$salt[0])."'";
$sqlresult = mysql_query($sqlquery);
unset($accesskey, $salt);
//Check whether the query was successful or not
if($sqlresult) {
if(mysql_num_rows($sqlresult) == 1)
{echo 'Login successfull';}
else {die('Error: wrong user ID/password');}
}
}
Я знаю, что есть много, возможно, слишком много веб-сайтов, на которых обсуждаются плюсы и минусы соли. Но никто не отвечает, должна ли соль быть зашифрована или нет - и никто не показывает, как кодировать сценарий входа со случайными (!) Солями (сохраненными в базе данных, как я сделал).
Так что, как начинающий php, я понятия не имею, является ли этот код безопасным или нет? Или, если есть какие-то приемы, чтобы сделать это быстрее или более упорядоченным ... Спасибо!