Повторное рассмотрение: Предварительное хеширование пароля перед применением bcrypt, чтобы избежать ограничения длины пароля.

Вопрос или проблема

Okta выпустила уведомление о безопасности 4 дня назад, в котором говорится, что учетные записи с именем пользователя длиной более 52 символов могут входить в систему с произвольным паролем при определенных условиях. Некоторые пользователи в X/Twitter подозревают, что Okta использует userid + username + password в качестве входных данных для bcrypt.

Если это правда, тогда пароль будет игнорироваться bcrypt, если userid + username будет достаточно длинным.

Один из комментаторов предложил предварительно хэшировать входные данные с помощью SHA256 перед применением bcrypt, тем самым избегая проблемы с ограничением длины. Этот метод предварительного хэширования также упоминается (и обычно одобряется) в некоторых ответах на этом сайте (1,2).

Тем не менее, чек-лист OWASP недвусмысленно отговаривает от этого:

Альтернативный подход – предварительно хэшировать пароль, предоставленный пользователем, с помощью быстрого алгоритма, такого как SHA-256, а затем хэшировать полученный хэш с помощью bcrypt (т.е. bcrypt(base64(hmac-sha256(data:$password, key:$pepper)), $salt, $cost)). Это опасная (но распространенная) практика, которой следует избегать из-за password shucking и других проблем при сочетании bcrypt с другими хэш-функциями.

Я не эксперт в области безопасности, поэтому ищу профессиональные мнения:

  1. Должен ли я строго избегать предварительного хэширования ввода для bcrypt с помощью другой хэш-функции, как упоминается в чек-листе OWASP?
  2. Буду ли я в серьезных проблемах (например, пароли легко взламываются), если я предварительно хэширую ввод для bcrypt с помощью SHA256?
  3. Кто-то на Reddit предлагает, что добавление соли к хэшу sha256 ПЕРЕД применением bcrypt может предотвратить password shucking. Это правда?

Существует обсуждение о использовании соли для защиты от password shucking в этом вопросе, который стоит прочитать.

Так что да, вы можете защититься от этого, используя соль. Однако вам нужно убедиться, что вы применяете соль к паролю, а не к хэшу. То есть, ваша конструкция должна быть bcrypt(sha256($password.$salt)), а не bcrypt(sha256($password).$salt).

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

Но если предположить, что вы просто хэшируете пароль пользователя (не делая что-то странное, добавляя его к концу имени пользователя/ID, как вы предложили в своем посте), то я бы сомневался, действительно ли вы что-то выигрываете по сравнению с просто соблюдением ограничения ввода в 72 байта (или сколько ваша реализация поддерживает).

И если вас беспокоит это ограничение длины ввода, то, вероятно, вам лучше будет перейти на argon2id (который не имеет практического ограничения длины ввода), а не добавлять сложности, пытаясь обойти ограничения bcrypt.

Ответ или решение

Вопрос: Строка перед хешированием пароля перед применением bcrypt для предотвращения ограничения длины пароля

Введение

Недавнее сообщение о безопасности от Okta всколыхнуло обсуждения в IT-сообществе, касающиеся выбора методов хеширования паролей. Как стало известно, учетные записи с именами пользователей длиной более 52 символов могут войти в систему с произвольным паролем при определенных условиях. Это вызывает сомнения в архитектуре, использующей комбинацию userid + username + password в процессе хеширования с использованием bcrypt. Критики предполагают, что длинные значения идентификатора и имени пользователя могут подавить обработку пароля, что ставит под сомнение целостность системы аутентификации.

Дискуссия о предхешировании

В качестве решения проблемы некоторые эксперты предлагают предхешировать ввод пароля с использованием алгоритма SHA-256 перед применением bcrypt, чтобы избежать проблем с ограничениями длины. Однако, согласно OWASP, такой подход не рекомендуется по следующим причинам:

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

Ответы на ключевые вопросы

  1. Следует ли строго избегать предхеширования входа bcrypt с использованием другой хеш-функции?
    Да, рекомендуется следовать рекомендациям OWASP и избегать предхеширования. Безопасность системы является наивысшим приоритетом, и любые варианты, увеличивающие риск несанкционированного доступа, должны быть отклонены.

  2. Буду ли я в серьезной опасности (например, пароли легко поддаются взлому), если я предхеширую ввод bcrypt с SHA256?
    Использование SHA256 в качестве предхеширования может серьезно подорвать безопасность. Хотя это может показаться улучшением производительности, реализация словно создает новый вектор атаки, который может быть использован злоумышленниками для нахождения паролей.

  3. Сможет ли соль, добавляемая к SHA256 перед применением bcrypt, защитить от password shucking?
    Соля можно использовать для улучшения безопасности, однако, она должна применяться к паролю, а не к его хешу. Таким образом, конструкция должна выглядеть как bcrypt(sha256($password.$salt)), а не bcrypt(sha256($password).$salt). Тем не менее, важно также понимать, что многие решения для хеширования паролей, такие как Argon2, предоставляют большую гибкость и безопасность, чем bcrypt, без ограничений на длину входных данных.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...