Соли: хешированный или простой текст? - PullRequest
2 голосов
/ 02 июля 2011

Я хочу хранить (случайную) соль рядом с паролем в базе данных. Теперь вопрос:

Стоит ли хранить его в хеше или в виде простого текста? Есть ли разница (больше безопасности, быстрее?)? Сколько усилий я должен приложить для создания случайной строки?

Пример кода:

    //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, я понятия не имею, является ли этот код безопасным или нет? Или, если есть какие-то приемы, чтобы сделать это быстрее или более упорядоченным ... Спасибо!

Ответы [ 4 ]

4 голосов
/ 02 июля 2011

Это не имеет значения. Вы можете предположить, что соль является общедоступной информацией, поскольку атака, от которой она защищает, - словарные атаки с помощью радужных таблиц - не облегчается, если соль известна атакующему. Вы должны спросить себя, почему вы думаете, что это хорошая идея - сначала зашифровать соль.

Кроме того, вы должны прочитать это:

3 голосов
/ 02 июля 2011

Поскольку вам нужна соль для вычисления хэша пароля в сценарии входа в систему, вы не можете просто сохранить хэш соли, так как это будет необратимой операцией, то есть исходная соль будет потеряна.

Итак, я предполагаю, что вы спрашиваете, дает ли хеширование исходной соли, полученной при выборе случайной строки, лучшую соль.В этом случае использование хеширующей функции не имеет ничего общего с «хешированием», это просто способ генерировать более длинную, казалось бы, более случайную последовательность.Это, однако, не имеет никакого смысла, поскольку хешированная соль все равно должна храниться в базе данных - в незашифрованном виде, если хотите!

3 голосов
/ 02 июля 2011

Никто не говорит о хешировании соли, потому что хеширование соли невозможно . Если не понятно почему - и если вы действительно «понятия не имеете, является ли этот код безопасным или нет» - пожалуйста используйте чужую систему аутентификации вместо того, чтобы создавать свою, потому что ее очень и очень легко оставить зияющие дыры в безопасности, если вы не знаете, что делаете.

Edit:

Хеш односторонний. Вы вводите данные. Вы не вынимаете данные. Вот для чего это. Если вы добавите соль, вы не сможете ее достать. Если вы не можете получить его, вы не можете добавить его к паролю, который предоставляет пользователь. Если вы не можете этого сделать, вы не можете использовать это как соль.

0 голосов
/ 02 июля 2011

Цель соли в том, чтобы кто-то не мог использовать одни и те же радужные таблицы для взлома всех паролей. Создание новой радужной таблицы для каждого пароля просто делает метод слишком неэффективным. Вам не нужно прятать соль, ее скрытие не повышает безопасность.

Поскольку соль не является криптографическим ключом, и ее не нужно скрывать, вам не нужно быть очень сложным при их создании. Просто используйте обычный генератор случайных чисел, чтобы выбрать несколько случайных символов.

Кроме того, вы все равно не можете хэшировать соль, потому что тогда вы не сможете использовать ее для проверки паролей, когда кто-то хочет войти в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...