Username, Password, Salting, Encrypting, Hash - Как все это работает?

Возможный дубликат:
Защищенный хэш и соль для паролей 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? Ему не нужно правильно угадать длинную зашифрованную строку?

Примечание. Предположим, что в этой ситуации нет никаких капчей, нет ограничений на количество попыток, нет блокировки, ничего, кроме вышеперечисленного.

Примечание: будьте осторожны, я все еще учусь.

Ответ 1

Если вы исключаете капчу, попробуйте ограничения, блокировки и т.д.... тогда да. Вам просто нужно принудительно использовать текстовую строку.

Однако для этого требуется время - по крайней мере, оно ограничено скоростью, с которой сервер будет отвечать на запросы входа. Даже если разработчик не добавляет каких-либо мер для предотвращения принудительного форматирования, сам сервер может пройти через процесс шифрования + проверки так быстро и может обрабатывать только столько параллельных запросов.

Тем не менее, это важно для

  • Как пользователь, используйте сильный, жесткий и грубый пароль.
  • Как разработчик, у вас есть адекватные меры для предотвращения грубого форсирования вашего процесса входа в систему.

Хеширование и соление паролей - это не защита от людей, которые перенаправляют естественный процесс входа в систему (есть другие вещи, которые защищают от этого). Вместо этого они должны защищать от возможного компрометации самого хранилища паролей (например, кто-то сбрасывает содержимое базы данных).

Как хэширование, так и соление служат для уменьшения скорости, с которой кто-то, у кого есть доступ к сохраненным паролям, может получить текстовую строку, которую им нужно будет пройти через естественный процесс входа в систему (вашего сайта или другого сайтов, учитывая, что пароли обычно используются между сайтами) без отключения мер защиты от принудительного вмешательства.

Ответ 2

Идея хэширования и соления заключается в том, чтобы помешать кому-либо принимать пользовательские пароли, если сама база данных скомпрометирована. Если пароли хранятся как соленые и хешированные строки, злоумышленник не может просто использовать их для доступа к учетной записи пользователя на другом сайте.

Ответ 3

Шифрование паролей - это одностороннее шифрование (или, скорее, его предполагается находиться в защищенном сайте). То есть вы берете пароль, и вы создаете хэш. bcrypt, например, является приемлемым стандартом для этого сегодня.

Если это одностороннее шифрование, многие люди задаются вопросом, как он может проверять пароль. Но вы просто хэш-пароль, который пользователь представляет, и сравнить его с тем, что хэш вы храните в базе данных. Таким образом, если ваша база данных украдена, злоумышленник должен работать намного сложнее.

Проблема с простое хеширование пароля легко грубо вынуждена или радуга. Вы можете использовать Google Rainbow Table, чтобы узнать больше об этом. Но, по сути, это способ превратить эти хэши в пароли.

Введите соление. Salting добавляет случайные данные по существу к каждому паролю. Это козыри радужных столов. Значение скомпрометированной базы данных будет означать грубую силу. Что, если вы используете хеш-систему, такую ​​как bcrypt, требует много времени и сил для атакованных.

Сказав все это. Лучше не изобретать велосипед. Просто используйте известную систему авторизации, если сможете.

Ответ 4

Смотрите мой ответ здесь

И вы должны создавать уникальные соли для каждой записи, когда вы создаете хэш.

Ответ 5

Одной из проблем с атаками грубой силы является использование быстрого шифрования, такого как SHA1 или MD5. Эти функции строятся для быстрого запуска пароля с помощью алгоритма. Вместо этого вы можете использовать метод Blowfish, который не является экспертом, но длинный рассказ короче, для получения возвращаемого значения требуется больше вычислений, чем SHA1 или MD5. Это означает, что может потребоваться 5 лет для перебора пароля, хэшированного Blowfish из-за времени вычисления.

Следующий пример сделан с SHA1 и MD5, поэтому он уязвим для грубых атак, однако солевая часть должна быть в порядке:

$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
}