Уважаемые друзья, временно не работает форма вопрос - ответ. В бижайшее время починю. Если у кого есть вопросы, можете присылать мне на почту bezramok-tlt@mail.ru

Генератор пароля + соль в пароле для хранения в MySQL

Генератор пароля + соль в пароле для хранения в MySQL

Безопасность в интернете говорит сама за себя. Каждый из нас имеет учетные записи в интернете к различным сервисам таких как электронная почта, аккаунт google play, apple id и т.д. Таким образом возникает резонный вопрос хранения персональных данных, а именно шифрование пароля. Как показывает практика для более стойкого пароля его нужно «солить». Соль – это некая произвольная строка с буквами верхнего и нижнего регистра, цифр спецсимволы. Вот так выглядит «соль» uF4ryDp2. На первый взгляд похожа на пароль, так как способ генерации похож.

Теперь, когда у нас есть соль, пробуем засолить пароль. Допустим, что наш пароль 123, а соль uF4ryDp2. Нам нужно склеить хешированые строки пароля с солью по средствам функции MD5(); Как это происходит md5(md5(пароль) + md5(соль)); на выходе получаем хеш пароля dfc6e0bbe1a2a39639c5c51eda7735a9. Таким образом наш пароль довольно надежно защищен от взлома. Я имею ввиду саму кодовую фразу придуманную пользователем при регистрации, как мы с вами знаем при желании хакеры могут вытащить таблицу с данными, но пароли пользователей будут зашифрованными, чтобы их расшифровать потребуется много сил.

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

id login pass salt
1 pupkin dfc6e0bbe1a2a39639c5c51eda7735a9 uF4ryDp2

В поле pass хранится ХЕШ пароля + соль, а также в отдельной ячейке лежит соль к данному пользователю.

Создадим функцию генерации случайной строки, назовем ее getRandString(); принимать данная функция будет число указывающее длинну генерированной строки.


	/**
     * @param $num int
     * @return string
     */
    function getRandString($num){
        //Генерим массив из букв
        $letter = range('a', 'z');
        //Генерим массив из цифр
        $number = range(0, 9);

        //Создаем строку с маленькими и большими буквами и цифрами
        $letter = implode('',$letter);
        $letter = $letter.strtoupper($letter).implode('',$number);

        //Строка с генерированым паролем
        $randStr = '';
        for ($i = 0; $i < $num; $i++){
            //Прогоняем циклом столько, сколько нужно символов в строке
            $randStr .= $letter[rand(0, strlen($letter) - 1)];
        }
        return $randStr;
    }

$salt = getRandString(8);
$pass = md5(md5(getRandString(10)).md5($salt));
ET-NiK
20:19:53 27/10/2016г.
На дворе 2016 год, какой md5 для хранения паролей?

Это совсем не безопасно, есть специальные алгоритмы, предназначенные для паролей, bcrypt например.

Уважаемый ET-NiK bcrypt не панацея, и не спасет вас если у Вас украдут базу с шифрованными паролями алгоритмом bcrypt. MD5 так же как DES или SHA256 работают быстрее и потребляют менее ресурсов чем bcrypt. Вследствие чего перебор паролей шифрованных bcrypt будет происходить дольше чем у MD5, но в конечном результате пароль подберут. Все зависит от целей и навыков злоумышленников. Так что спорить чем лучше шифровать мне кажется бессмысленно, нужно думать о том чтобы базу не украли, а это уже совсем другая история...     

- Администрация     - 09:36:49 28/10/2016г.

Jenek
01:46:08 20/06/2016г.
Спасибо за статью! Все по делу.

И Вам спасибо за оценку.

- Администрация     - 10:01:33 20/06/2016г.

  • 1

Получить уведомление на Email

Введите код с картинки