"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Хэширование превращает данные любой длины в короткий код фиксированной длины — хэш. Оно помогает проверять данные и безопасно хранить пароли: сайт сравнивает хэши, а не сохраняет пароль открытым текстом. Хэш нельзя просто расшифровать, но разные входные данные иногда дают одинаковый результат — это коллизия. Соль, уникальная добавка к паролю, мешает злоумышленникам использовать заранее подготовленные таблицы хэшей.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Хэш-функция — правило, которое по входным данным произвольной длины вычисляет хэш-код фиксированной длины. Например, на вход можно подать короткое слово или большой файл, а результат всё равно будет иметь установленный размер. Это удобно, когда нужно быстро сравнивать данные или проверять, изменились ли они.
Хэш-код — результат применения хэш-функции к данным; он служит их кратким цифровым отпечатком. Это не копия исходного текста, а компактное значение, связанное с ним. По хэш-коду можно проверить совпадение данных, не храня их в исходном виде.
Коллизия — ситуация, когда разные входные данные дают одинаковый хэш-код. Она возможна, потому что множество вариантов входных данных больше, чем число кодов фиксированной длины. Для надёжной функции важно, чтобы найти такую пару было трудно.
Соль — случайная добавка к паролю, которую используют при вычислении его хэша и хранят вместе с ним. Для разных паролей создают разные соли, даже если сами пароли совпадают. Это помогает защитить хэши от массового подбора по готовым таблицам.
Хэш-функция принимает данные любой длины, но выдаёт код установленной длины. Так происходит потому, что алгоритм обрабатывает вход по определённым правилам и сводит его к результату заданного размера. Поэтому по длине хэша нельзя понять, было ли исходным сообщением одно слово или целый файл.
Если входные данные и функция не меняются, хэш-код тоже будет одинаковым. Это свойство позволяет проверять, совпадают ли данные: достаточно заново вычислить код и сравнить его с сохранённым. При этом восстановление исходного входа по коду должно быть практически невозможным, иначе хэш не помог бы защищать пароли.
Число возможных входов намного больше числа хэш-кодов фиксированной длины. Значит, хотя бы некоторые разные входы неизбежно будут давать один результат — такие совпадения и называют коллизиями. Сам факт коллизий не уничтожает пользу хэширования: для защиты важно, чтобы подобрать два входа с одинаковым кодом было крайне трудно.
Сайт не должен сохранять пароль пользователя в открытом виде: если базу данных украдут, злоумышленник сразу получит сами пароли. При регистрации сайт вычисляет хэш и сохраняет его, а при входе обрабатывает введённый пароль тем же способом. Если полученный код совпал с сохранённым, пароль считается верным; сравнивать пароль с хэшем как обычный текст нельзя.
Соль добавляют к паролю до вычисления хэша, причём для каждой записи выбирают отдельное значение. Поэтому один и тот же пароль у двух пользователей может дать разные результаты: на вход функции подаются разные сочетания пароля и соли. Если злоумышленник заранее составил таблицу хэшей для распространённых паролей, уникальная соль не даёт применить её сразу ко всем записям.
| Способ | Что хранится | Что происходит при входе | Основной риск или преимущество |
|---|---|---|---|
| Пароль в открытом виде | Сам пароль без преобразования | Введённый пароль сравнивается с сохранённым | Утечка базы сразу раскрывает пароли |
| Хэш пароля без соли | Результат хэширования пароля | Вычисляется хэш введённого пароля и сравнивается с сохранённым | Одинаковые пароли дают одинаковые хэши; помогают готовые таблицы |
| Хэш пароля с уникальной солью | Хэш и соль для каждой записи | Введённый пароль обрабатывается с сохранённой солью, затем сравниваются хэши | Труднее массово использовать готовые таблицы; соль не требуется скрывать |
Сравнивайте строки по тому, что именно попадает в базу и какие действия выполняются при входе. Так видно, почему открытый пароль опасен, а хэш лучше хранить вместе с уникальной солью. Таблица показывает основные различия, но не заменяет другие меры защиты учётной записи.
При регистрации пароль «abc123» преобразовали хэш-функцией и сохранили результат. Нужно объяснить, что хранить вместо пароля и как проверить его при следующем входе. Здесь важно не пытаться расшифровать сохранённый код: проверка строится на повторном вычислении.
Ответ: хранить следует хэш, а не сам пароль; при входе нужно вычислить хэш введённого значения и сравнить его с сохранённым. В реальной системе для вычисления используют также соль, сохранённую для этой записи. Тогда пароль проверяется с учётом той же добавки, что применялась при регистрации.
Два пользователя выбрали один и тот же пароль, но для каждой записи применяется уникальная соль. Нужно понять, почему в базе могут оказаться разные коды. Причина не в изменении паролей: хэш-функция получает разные входные данные.
Ответ: разные соли приводят к разным хэшам одинакового пароля. Входная проверка всё равно возможна: для каждого пользователя сайт берёт именно его соль и вычисляет код введённого пароля. Затем он сверяет результат с хэшем, сохранённым для этой записи.
В базе находятся хэши паролей без соли. Злоумышленник может заранее вычислить хэши популярных паролей и составить таблицу соответствий, а затем искать совпадения с украденной базой. Нужно объяснить, почему этот способ опасен и что меняет соль.
Ответ: отсутствие соли позволяет повторно использовать заранее вычисленные соответствия для массового поиска. Уникальная соль затрудняет такой подход, потому что для каждой записи нужен отдельный расчёт. Она не делает слабый пароль невозможным для подбора, но лишает злоумышленника удобного способа проверять сразу много хэшей по одной таблице.
Считать хэширование шифрованием. Эти процессы похожи лишь тем, что преобразуют данные: шифрование можно обратить с помощью ключа, а хэш обычно не предназначен для восстановления. Путаница возникает из-за того, что оба результата могут выглядеть как набор символов. Проверьте себя вопросом: предусмотрен ли ключ, с помощью которого исходный текст можно расшифровать?
Полагать, что коллизий не бывает. У хэш-кодов конечная длина, а входных данных может быть намного больше, поэтому разные входы способны дать одинаковый результат. Коллизии не означают, что функция бесполезна, если их трудно подобрать. Для самопроверки вспомните: число возможных результатов ограничено, а число возможных входов — нет.
Сравнивать пароль с хэшем как с текстом. В базе хранится результат вычисления, а не строка пароля, поэтому напрямую сравнить эти записи нельзя. Ошибка возникает, если забыть, что проверка тоже требует преобразования. Убедитесь, что введённый пароль сначала проходит ту же обработку, включая ту же соль, а уже потом сравниваются хэши.
Считать соль секретной. Соль обычно хранится вместе с хэшем, ведь её задача не скрыть пароль, а сделать массовое применение готовых таблиц неэффективным. Секретность здесь путают с уникальностью. Проверьте себя: у каждой записи должна быть своя соль, но для проверки пароля системе необходимо иметь к ней доступ.
Для понимания хэширования полезно знать, как компьютер представляет данные: текст и файлы в итоге обрабатываются как последовательности значений. Также важно отличать хэширование от шифрования: первое обычно необратимо, а второе предусматривает восстановление данных с ключом. Эти знания помогают правильно понимать, что именно хранится в базе.
Хэширование применяют не только для паролей. Сравнение хэшей помогает обнаружить изменение файла или сообщения, то есть проверить целостность данных. В системах аутентификации хэши позволяют подтверждать знание пароля, не сохраняя его открытым текстом.
Можно ли восстановить пароль по его хэшу?
Обычно хэш-функция устроена так, что восстановить исходные данные по хэшу практически невозможно. Но злоумышленник может перебирать возможные пароли и сравнивать их хэши с украденными данными, поэтому важны надёжный пароль и безопасное хранение.
Почему одинаковые пароли могут иметь разные хэш-коды?
Перед хэшированием к паролю добавляют соль — случайное значение, уникальное для каждой записи. Поэтому хэш вычисляется для разных сочетаний пароля и соли, даже если пароли одинаковы.
Что такое коллизия и означает ли она, что хэш-функция бесполезна?
Коллизия возникает, когда разные входные данные дают один и тот же хэш-код. Она неизбежна, поскольку возможных входов больше, чем кодов, но это не делает функцию бесполезной: важно, насколько трудно подобрать такую пару.
Нужно ли хранить соль в секрете?
Нет, соль обычно хранят вместе с хэшем пароля. Её задача — быть уникальной для каждой записи и затруднять массовое применение заранее вычисленных таблиц, а не скрывать пароль.
Чем хэширование отличается от шифрования?
Шифрование предназначено для обратимого преобразования: при наличии ключа исходные данные можно расшифровать. Хэширование обычно необратимо и не использует ключ для восстановления входа.
§ 79. Хэширование и пароли