Введение
Не вдаваясь в технические и математические детали, было бы полезно немного объяснить разницу между шифрованием , хэшированием и засолкой .
Шифрование
Шифрование существует очень долго. Египтяне использовали его для создания тайн и развлечений, а римляне использовали его для отправки секретных сообщений. Когда вы шифруете пароль, вы применяете какой-то алгоритм, который его взламывает. Применяя ключ, расшифровывает его.
ROT13 - простой пример алгоритма шифрования. Он в основном заменяет каждую букву на 13 мест в алфавите.
Не пей вино.
= Qba'g qevax gur jvar.
ROT13, очевидно, является довольно слабым алгоритмом, но здесь полезно проиллюстрировать ключевой момент - зашифрованные данные обратимы. Это так по замыслу. Нет смысла шифровать секретное сообщение, если человек на другом конце не может его расшифровать. Поэтому это полезно для таких вещей, как номера кредитных карт или электронные письма. Веб-браузер, в котором вы читаете это, также использует шифрование.
Сервер шифрует данные, отправляет их через безопасное соединение SSL в ваш браузер, который расшифровывает их, чтобы вы могли их прочитать.
хеширование
Хеширование отличается от шифрования тем, что как только данные закодированы, они не могут быть декодированы. Ну, по крайней мере, это крайне сложно сделать. В отличие от шифрования выходные данные всегда имеют фиксированную длину, в зависимости от используемого вами алгоритма.
Используя нашу предыдущую фразу и алгоритм MD5, мы получаем ...
Не пей вино.
= b290557177ec5dd7098d1de84616dd04
Если мы попробуем более длинную фразу ...
Пожалуйста, не пей вино, оно ужасно на вкус.
= fd870b20869d9ae05d84e3d7fbed0c94
Вы увидите, что результаты имеют одинаковую длину. Это означает, что несколько входов могут привести к одному и тому же выходу, называемому столкновением .
Хеширование полезно при хранении вещей, которые вам не нужно читать обратно, но вы должны проверить. Пароли являются основным примером. Вместо хранения открытого текста вы сохраняете хешированную версию. Затем, когда кто-то вводит свой пароль, вы применяете тот же алгоритм хеширования и сравниваете его с тем, что есть в базе данных. Если они совпадают, то ворота открываются.
Хеш-функции также можно использовать для проверки того, была ли информация подделана. Отправляя электронное письмо, вы сначала сообщаете секретное значение, о котором знают только вы и получатель. Перед отправкой электронного письма вы подписываете его своим секретным значением и производите хэш-значение. Затем отправьте свое электронное письмо (без секретного значения) вместе со значением хеша. Ваш друг может затем выполнить тот же процесс, и если хэши совпадают, то они знают, что ваше сообщение не было подделано в процессе. Этот метод называется кодом проверки подлинности сообщения или кодом проверки подлинности сообщения на основе хеш-функции.
Важным фактором для алгоритмов хеширования является то, что они работают только одним способом. Единственный способ определить первоначальную стоимость - это грубая сила. Попытка нескольких значений, чтобы видеть, производят ли они тот же самый хэш.
Это особенно проблематично для паролей, которые обычно короткие и используют часто встречающиеся слова. Современному компьютеру не понадобилось бы очень много времени, чтобы пробежаться по большому словарю (или использовать существующие радужные таблицы) и выяснить результат хеширования каждого общего пароля.
Вот тут и начинается засолка.
Соление
Помимо засорения ваших артерий, соли могут засорить любого, кто пытается взломать хешированный пароль. Они работают, добавляя дополнительное секретное значение в конец ввода, увеличивая длину исходного пароля.
Скажите, что ваш пароль ненадежный, а значение соли - i.love.salt. Значение хеша будет составлено из обоих этих значений: rockyi.love.salt. Это обеспечивает некоторую защиту тем людям, которые используют общие слова в качестве пароля. Однако, если кто-то узнает о значении соли, которое вы используете, он просто добавляет его в конец (или начало) каждого словарного слова, которое он пытается использовать в своей атаке.
Чтобы сделать это более сложным, вы можете использовать случайные соли, по одной на каждый пароль. Очевидно, что он должен храниться в базе данных, где-то в соответствии с учетной записью пользователя, но это делает грубую атаку намного сложнее. Наконец, вы можете создать соль из нескольких частей, вы можете использовать текущую дату-время, имя пользователя, секретную фразу, случайное значение или их комбинацию.