Как вы правильно заметили, стандартные схемы хеширования паролей не будут работать, если аутентификация выполняется с использованием только подстроки пароля.Существует несколько способов реализации такой системы:
Сохранение пароля в виде простого текста:
- Простота и легкость реализации.
- Небезопасно, если база данных взломана.
- Может не соответствовать правилам, требующим хеширования или шифрования паролей (но использование низкоуровневого шифрования базы данных может обойти это).
Хранить пароль в зашифрованном виде, расшифровывать для проверки:
- Не более безопасно, чем хранить его в открытом виде, если ключ шифрования также скомпрометирован.
- Может удовлетворять правилам, запрещающимХранение пароля в обычном режиме.
- Можно сделать более безопасным, используя выделенный аппаратный модуль безопасности или отдельный сервер аутентификации, который будет хранить ключ и предоставлять интерфейс черного ящика для шифрования ипроверка подстроки.
Хранить хэши всех (или достаточного количества) возможных подстрок:
- Требуется намного большепространство для хранения, чем у других решений.
- Пароль все еще можно довольно легко восстановить с помощью грубой силы, если база данных взломана, поскольку каждая подстрока может быть атакована отдельно.
Использование k -out-of- n разделение секретного порогового значения :
- Требуется меньше места, чем для хранения нескольких хэшей, но большечем хранение пароля в простом виде или использование обратимого шифрования.
- Нет необходимости расшифровывать пароль для проверки подстроки.
- Все еще подвержен атаке методом перебора, если база данных взломана: любой, кто может угадать k буквы пароля могут восстановить остальные.(На самом деле, в некоторых реализациях k -1 букв может быть достаточно.)
В конечном счете, все эти схемы страдают слабостью против атак методом перебора, если база данных взломана,Фундаментальная причина этого заключается в том, что в трехбуквенной подстроке типичного пароля (или даже даже очень сильного) энтропия не так уж и велика, поэтому взломать не придется много догадок.
Что из этого лучше?Сложно сказать.Если бы у меня было , чтобы выбрать одну из этих схем, я бы, вероятно, выбрал зашифрованное хранилище с использованием строгого симметричного шифрования (такого как AES) с отдельным сервером или HSM для обработки шифрования и проверки.Таким образом, по крайней мере, злоумышленник, скомпрометировавший интерфейсный сервер, не сможет просто скопировать базу данных и атаковать ее в автономном режиме (хотя он все равно может организовать атаку методом подбора, если на нем не реализовано эффективное ограничение скорости).).
Тем не менее, я бы сказал, что сама идея использования только части пароля для аутентификации глубоко ошибочна: на самом деле она не дает преимуществ безопасности, за исключением некоторых особо ограниченных.Сценарии атаки (например, перехватчик, который может наблюдать только одно событие аутентификации и не может просто продолжать попытки, пока не получат ту же самую задачу), однако это существенно ослабляет безопасность, уменьшая объем информации, необходимой для успешной аутентификации.Существуют гораздо лучшие решения, такие как TAN , для решения проблем безопасности, которые должна решать частичная аутентификация по паролю.