На Горох
Информатика, 10 класс

§ 79. Хэширование и пароли

"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.

Объяснение темы В оглавлении: § 79. Хэширование и пароли

Кратко о теме

Хэширование превращает данные любой длины в короткий код фиксированной длины — хэш. Оно помогает проверять данные и безопасно хранить пароли: сайт сравнивает хэши, а не сохраняет пароль открытым текстом. Хэш нельзя просто расшифровать, но разные входные данные иногда дают одинаковый результат — это коллизия. Соль, уникальная добавка к паролю, мешает злоумышленникам использовать заранее подготовленные таблицы хэшей.

Объяснение темы

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

Определения и обозначения

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

Хэш-код — результат применения хэш-функции к данным; он служит их кратким цифровым отпечатком. Это не копия исходного текста, а компактное значение, связанное с ним. По хэш-коду можно проверить совпадение данных, не храня их в исходном виде.

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

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

Как это устроено

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

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

Число возможных входов намного больше числа хэш-кодов фиксированной длины. Значит, хотя бы некоторые разные входы неизбежно будут давать один результат — такие совпадения и называют коллизиями. Сам факт коллизий не уничтожает пользу хэширования: для защиты важно, чтобы подобрать два входа с одинаковым кодом было крайне трудно.

Сайт не должен сохранять пароль пользователя в открытом виде: если базу данных украдут, злоумышленник сразу получит сами пароли. При регистрации сайт вычисляет хэш и сохраняет его, а при входе обрабатывает введённый пароль тем же способом. Если полученный код совпал с сохранённым, пароль считается верным; сравнивать пароль с хэшем как обычный текст нельзя.

Соль добавляют к паролю до вычисления хэша, причём для каждой записи выбирают отдельное значение. Поэтому один и тот же пароль у двух пользователей может дать разные результаты: на вход функции подаются разные сочетания пароля и соли. Если злоумышленник заранее составил таблицу хэшей для распространённых паролей, уникальная соль не даёт применить её сразу ко всем записям.

Способы хранения паролей и их особенности

СпособЧто хранитсяЧто происходит при входеОсновной риск или преимущество
Пароль в открытом видеСам пароль без преобразованияВведённый пароль сравнивается с сохранённымУтечка базы сразу раскрывает пароли
Хэш пароля без солиРезультат хэширования пароляВычисляется хэш введённого пароля и сравнивается с сохранённымОдинаковые пароли дают одинаковые хэши; помогают готовые таблицы
Хэш пароля с уникальной сольюХэш и соль для каждой записиВведённый пароль обрабатывается с сохранённой солью, затем сравниваются хэшиТруднее массово использовать готовые таблицы; соль не требуется скрывать

Сравнивайте строки по тому, что именно попадает в базу и какие действия выполняются при входе. Так видно, почему открытый пароль опасен, а хэш лучше хранить вместе с уникальной солью. Таблица показывает основные различия, но не заменяет другие меры защиты учётной записи.

Разбор задач

Проверка пароля при входе

При регистрации пароль «abc123» преобразовали хэш-функцией и сохранили результат. Нужно объяснить, что хранить вместо пароля и как проверить его при следующем входе. Здесь важно не пытаться расшифровать сохранённый код: проверка строится на повторном вычислении.

  1. При регистрации сайт вычисляет хэш пароля «abc123» и сохраняет этот результат вместо открытого текста.
  2. При следующем входе пользователь вводит пароль, а сайт применяет к нему ту же хэш-функцию.
  3. Сайт сравнивает новый хэш с сохранённым: совпадение означает, что введённый пароль соответствует зарегистрированному.

Ответ: хранить следует хэш, а не сам пароль; при входе нужно вычислить хэш введённого значения и сравнить его с сохранённым. В реальной системе для вычисления используют также соль, сохранённую для этой записи. Тогда пароль проверяется с учётом той же добавки, что применялась при регистрации.

Одинаковые пароли у пользователей

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

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

Ответ: разные соли приводят к разным хэшам одинакового пароля. Входная проверка всё равно возможна: для каждого пользователя сайт берёт именно его соль и вычисляет код введённого пароля. Затем он сверяет результат с хэшем, сохранённым для этой записи.

Готовые таблицы хэшей

В базе находятся хэши паролей без соли. Злоумышленник может заранее вычислить хэши популярных паролей и составить таблицу соответствий, а затем искать совпадения с украденной базой. Нужно объяснить, почему этот способ опасен и что меняет соль.

  1. Без соли одинаковые пароли дают одинаковые хэши, поэтому одна готовая таблица подходит для сравнения со многими записями.
  2. Злоумышленник сопоставляет хэш из базы со значениями таблицы и при совпадении получает вероятный пароль.
  3. Уникальная соль меняет вход для каждой записи: таблицу пришлось бы готовить отдельно для каждого значения соли.

Ответ: отсутствие соли позволяет повторно использовать заранее вычисленные соответствия для массового поиска. Уникальная соль затрудняет такой подход, потому что для каждой записи нужен отдельный расчёт. Она не делает слабый пароль невозможным для подбора, но лишает злоумышленника удобного способа проверять сразу много хэшей по одной таблице.

Типичные ошибки

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

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

Сравнивать пароль с хэшем как с текстом. В базе хранится результат вычисления, а не строка пароля, поэтому напрямую сравнить эти записи нельзя. Ошибка возникает, если забыть, что проверка тоже требует преобразования. Убедитесь, что введённый пароль сначала проходит ту же обработку, включая ту же соль, а уже потом сравниваются хэши.

Считать соль секретной. Соль обычно хранится вместе с хэшем, ведь её задача не скрыть пароль, а сделать массовое применение готовых таблиц неэффективным. Секретность здесь путают с уникальностью. Проверьте себя: у каждой записи должна быть своя соль, но для проверки пароля системе необходимо иметь к ней доступ.

Связь с другими темами

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

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

Что запомнить

  • Хэш-функция переводит входные данные в хэш-код фиксированной длины.
  • Одинаковый вход при одной функции даёт одинаковый результат.
  • По хэш-коду практически невозможно восстановить исходные данные.
  • Коллизия — совпадение хэшей у разных входных данных.
  • Пароли в базе не следует хранить в открытом виде.
  • Уникальная соль приводит к разным хэшам одинаковых паролей.

Частые вопросы по теме

Можно ли восстановить пароль по его хэшу?

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

Почему одинаковые пароли могут иметь разные хэш-коды?

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

Что такое коллизия и означает ли она, что хэш-функция бесполезна?

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

Нужно ли хранить соль в секрете?

Нет, соль обычно хранят вместе с хэшем пароля. Её задача — быть уникальной для каждой записи и затруднять массовое применение заранее вычисленных таблиц, а не скрывать пароль.

Чем хэширование отличается от шифрования?

Шифрование предназначено для обратимого преобразования: при наличии ключа исходные данные можно расшифровать. Хэширование обычно необратимо и не использует ключ для восстановления входа.

Спросить по теме параграфа

§ 79. Хэширование и пароли

Эта же тема в других учебниках

Учебник

Оглавление →
Предмет
Информатика
Класс
10 класс
Учебник
"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.