Безопасность в интернете говорит сама за себя. Каждый из нас имеет учетные записи в интернете к различным сервисам таких как электронная почта, аккаунт 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));
27/10/2016 20:19:53
Уважаемый ET-NiK bcrypt не панацея, и не спасет вас если у Вас украдут базу с шифрованными паролями алгоритмом bcrypt. MD5 так же как DES или SHA256 работают быстрее и потребляют менее ресурсов чем bcrypt. Вследствие чего перебор паролей шифрованных bcrypt будет происходить дольше чем у MD5, но в конечном результате пароль подберут. Все зависит от целей и навыков злоумышленников. Так что спорить чем лучше шифровать мне кажется бессмысленно, нужно думать о том чтобы базу не украли, а это уже совсем другая история...
28/10/2016 09:36:49