Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Технологии > Алгоритмы > MD5

Хранение паролей в базе данных. md5() + соль

В этой статье я расскажу как безопасно хранить пароли в базе данных

1 способ. Храним пароль как есть. Например, если ввели пароль "fuckoff", то он так и сохранится. Минус в том, что при взломе БД злоумышленник получает все пароли в явном виде.

хранение пароля в явном виде

2 способ. Храним пароль в зашифрованном виде, используя алгоритмы шифрования md5, sha1 и т.д. Например, md5('loveyou') = "f74a10e1d6b2f32a47b8bcb53dac5345"

пароль в md5

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

На первый взгляд кажется невозможным перебрать огромное количество комбинаций. Однако у большинства пользователей пароль представлен цифрами, словарными словами и другими простыми комбинациями символов. Поэтому задача упрощается (особенно, если пароль представлен цифрами). Кроме того, существуют сервисы, которые хранят терабайты хешей паролей (Rainbow tables). Например, сервис http://gdataonline.com/, содержит 1 133 000 000 паролей. Взлом пароля "loveyou" занимает сотые доли секунды

Rainbow tables

3 способ. Храним пароль в зашифрованном виде, но добавляя несколько случайных символов, уникальных для каждого пользователя (так называемая соль). А еще лучше хранить двойной md5 с солью. Взломать такой вышеупомянутым способом практически невозможно. В таблице user нам потребуется два поля:
1) поле salt для хранения соли
2) поле password для хранения хеша от md5(md5(пароль)+соль).

пароль с солью

Например, авторизация пользователя

// $user - информация о пользователе из таблицы user
if (md5(md5($_POST['password']).$user['salt']) == $user['password']) {
    // проверка прошла успешно. логиним!
}

Где брать соль? Необходимо в скрипте регистрации генерировать соль для каждого нового пользователя. Для этого можно воспользоваться следующей функцией

function generateSalt() {
    $salt = '';
    $length = rand(5,10); // длина соли (от 5 до 10 сомволов)
    for($i=0; $i<$length; $i++) {
         $salt .= chr(rand(33,126)); // символ из ASCII-table
    }
    return $salt;
}

Различные варианты соления в известных движках:

  • md5($pass.$salt) - применяется в Joomla
  • md5(md5($pass).$salt) - применяется в vBulletin
  • md5(md5($salt).md5($pass)) - применяется в новых IP.Board
Материал взят с сайта: http://ekimoff.ru/74/
Главная > Технологии > Алгоритмы > MD5