В чем разница между кодированием и хешированием? Как в таком случае сверяют пароль пользователя, если хеш необратим?
Кодирование — это обратимое преобразование данных без секрета (например, для передачи), а хеширование — одностороннее преобразование данных в фиксированный «отпечаток», из которого исходные данные восстановить нельзя. При проверке пароля система не раскодирует и не «расшифровывает» хеш, а заново хеширует введённый пароль тем же алгоритмом (с той же солью) и сравнивает два хеша. Если хеши совпали, пароль считается верным.
Важно различать три понятия: кодирование, шифрование и хеширование.
Base64) делает данные удобными для передачи или хранения. Оно полностью обратимо без какого‑либо секрета: зная формат, любой может восстановить исходные данные.AES) защищает данные: преобразование обратимо только при знании ключа. Без ключа расшифровать данные практически нереально.SHA‑256 или специализированные bcrypt, Argon2) — одностороннее преобразование произвольных данных в строку фиксированной длины. Обратно получить исходные данные по хешу алгоритмически нельзя, а подобрать другие данные с тем же хешем крайне сложно.Поэтому для паролей в базе хранят не сами пароли, а их хеши: даже если база утечёт, злоумышленник не увидит пароли в открытом виде.
Как проверяют пароль, если хеш необратим
При регистрации:
password hashing (например, bcrypt или Argon2).При входе:
Зачем нужны соль и «тяжёлые» алгоритмы
Без соли одинаковые пароли у разных пользователей давали бы одинаковые хеши, и по ним было бы легко находить типичные пароли с помощью заранее просчитанных таблиц (rainbow tables). Соль делает каждый хеш уникальным, а «дорогие» алгоритмы вроде bcrypt и Argon2 сильно замедляют перебор, поэтому взлом большого числа паролей становится крайне затратным.
Отметьте свой прогресс