Возможный дубликат:
Безопасный хэш и соль для паролей PHP
Iv'e читал много сообщений как в stackoverflow, так и на других сайтах, говорящих о безопасности в Интернете. Такие, как соление шифрования и т. Д. И я вроде бы не понимаю, поэтому простое объяснение было бы действительно полезно.
Итак, вот что я знаю до сих пор. Пользователь регистрирует типы своего имени пользователя и пароля. Вход затем проходит через процесс. Допустим, что имя пользователя и пароль объединены, например:
$username = (USERS USERNAME INPUT); $password = (USERS PASSWORD INPUT); $userinput = $username . $password;
Затем добавим соль.
$salt1 = "13$13aVc!kd"; $salt2 = "4kr$!vlmeoc"; $salted = $salt1 . $userinput . $salt2;
Затем мы зашифровываем его.
$encrypted = encrypt($salted);
Затем проверьте с помощью базы данных, и если ее правильный пользователь войдет в систему.
Так оно работает правильно? Но Iv'e читал о нападении грубой силы. Он правильно оценивает входные значения? С помощью процедуры выше. Разве это не показывает, что злоумышленнику нужно только получить правильную информацию о пользователе $ userinput? Ему не нужно угадывать длинную зашифрованную строку?
Примечание. Давайте скажем, что в этой ситуации нет никакой переписки, нет ограничений на количество попыток, отсутствие блокировки, ничего, кроме вышеперечисленного.
Примечание. Будьте осторожны, я все еще учусь.
Если вы исключаете капчу, попробуйте ограничения, блокировки и т. Д. … тогда да. Вам просто нужно принудительно использовать текстовую строку.
Однако это требует времени – по крайней мере, оно ограничено скоростью, с которой сервер будет отвечать на запросы входа. Даже если разработчик не добавляет каких-либо мер для предотвращения грубой форсировки, сам сервер может пройти через процесс шифрования + проверки так быстро и может обрабатывать только столько параллельных запросов.
Тем не менее, именно поэтому важно
Хеширование и соление паролей не защищать от людей, которые перенаправляют естественный процесс входа в систему (есть другие вещи, которые защищают от этого). Вместо этого они должны защищать от возможного компрометации самого хранилища паролей (например, кто-то сбрасывает содержимое базы данных).
Как хэширование, так и соление служат для снижения скорости, с которой кто-то, у кого есть доступ к сохраненным паролям, может получить строку обычного текста, которую им нужно будет пройти через естественный процесс входа в систему (вашего сайта или других сайтов , учитывая, что пароли обычно разделяемых между сайтами) без отключения мер защиты от принудительного вмешательства.
Идея хэширования и соления заключается в том, чтобы помешать кому-либо принимать пароли пользователей, если сама база данных скомпрометирована. Если пароли хранятся как соленые и хешированные строки, злоумышленник не может просто использовать их для доступа к учетной записи пользователя на другом сайте.
Шифрование паролей – это одностороннее шифрование (точнее, его предполагается находиться в безопасном месте). То есть вы берете пароль, и вы создаете хэш. bcrypt, например, является приемлемым стандартом для этого сегодня.
Если это одностороннее шифрование, многие люди задаются вопросом, как он может проверять пароль. Но вы просто хэш-пароль, который пользователь представляет, и сравнить его с тем, что хэш вы храните в базе данных. Таким образом, если ваша база данных украдена, злоумышленник должен работать намного сложнее.
Проблема с простое хеширование пароля легко грубо принудительно или радуга. Вы можете использовать Google Rainbow Table, чтобы узнать больше об этом. Но, по сути, это способ превратить эти хеши в пароли.
Введите соление. Salting добавляет случайные данные по существу к каждому паролю. Это козыри радужных столов. Значение скомпрометированной базы данных будет означать грубую силу. Что, если вы используете хэш-систему, такую как bcrypt, требует много времени и сил для атакованных.
Сказав это все. Лучше не изобретать велосипед. Просто используйте известную систему авторизации, если сможете.
См. Мой ответ здесь
И вы должны создавать уникальные соли для каждой записи, когда вы создаете хэш.
Одной из проблем с атаками грубой силы является использование быстрого шифрования, такого как SHA1 или MD5. Эти функции строятся для быстрого запуска пароля с помощью алгоритма. Вместо этого вы можете использовать метод Blowfish, который не является экспертом, но длинный рассказ короче, для получения возвращаемого значения требуется больше вычислений, чем SHA1 или MD5. Это означает, что может потребоваться 5 лет для перебора пароля, хэшированного Blowfish из-за времени вычисления.
Следующий пример сделан с SHA1 и MD5, поэтому он уязвим для нападений с использованием bruteforce, однако солевая часть должна быть в порядке:
$salt = md5(microtime().uniqueid());
Это даст уникальную соль 32 charecter, которую вы будете вместе с паролем.
$passwod = $_POST['password']; $hashed_password = sha1($password.$salt);
Теперь вам нужно сохранить как пароль, так и соль в базе данных. И когда вы проверяете пароль пользователя inputtet, вы получаете соль, а хэш – все это.
$temp_pass = $_POST['temp_pass']; $salt = //from database; $database_pass = //hashed pass from database; $hashed_temp_pass = sha1($temp_pass.$salt); if(hashed_temp_pass == $database_pass){ //Welcome user! } else{ //go away }