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

Генератор пароля + соль в пароле для хранения в 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));
  

Теги
Поддержи проект:

No-name
ET-NiK
На дворе 2016 год, какой md5 для хранения паролей? Это совсем не безопасно, есть специальные алгоритмы, предназначенные для паролей, bcrypt например.

27/10/2016 20:19:53

Администрация
Администрация

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

28/10/2016 09:36:49

No-name
Jenek
Спасибо за статью! Все по делу.

20/06/2016 01:46:08

Администрация
Администрация

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

20/06/2016 10:01:33


Copyright © 2014 - 2024 All rights reserved.