Безопасность в интернете говорит сама за себя. Каждый из нас имеет учетные записи в интернете к различным сервисам таких как электронная почта, аккаунт google play, apple id и т.д. Таким образом возникает резонный вопрос хранения персональных данных, а именно шифрование пароля. Как показывает практика для более стойкого пароля его нужно «солить». Соль – это некая произвольная строка с буквами верхнего и нижнего регистра, цифр спецсимволы. Вот так выглядит «соль» uF4ryDp2. На первый взгляд похожа на пароль, так как способ генерации похож.
Теперь, когда у нас есть соль, пробуем засолить пароль. Допустим, что наш пароль 123, а соль uF4ryDp2. Нам нужно склеить хешированые строки пароля с солью по средствам функции MD5(); Как это происходит md5(md5(пароль) + md5(соль)); на выходе получаем хеш пароля dfc6e0bbe1a2a39639c5c51eda7735a9. Таким образом наш пароль довольно надежно защищен от взлома. Я имею ввиду саму кодовую фразу придуманную пользователем при регистрации, как мы с вами знаем при желании хакеры могут вытащить таблицу с данными, но пароли пользователей будут зашифрованными, чтобы их расшифровать потребуется много сил.
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 bcrypt не панацея, и не спасет вас если у Вас украдут базу с шифрованными паролями алгоритмом bcrypt. MD5 так же как DES или SHA256 работают быстрее и потребляют менее ресурсов чем bcrypt. Вследствие чего перебор паролей шифрованных bcrypt будет происходить дольше чем у MD5, но в конечном результате пароль подберут. Все зависит от целей и навыков злоумышленников. Так что спорить чем лучше шифровать мне кажется бессмысленно, нужно думать о том чтобы базу не украли, а это уже совсем другая история...
И Вам спасибо за оценку.