#django #security #authentication #hash #salt
#django #Безопасность #аутентификация #хэш #соль
Вопрос:
Разве хэширование подсаливание адресов электронной почты и имен пользователей не является обычным делом? Например, при утечке данных вы не сможете узнать, кто зарегистрирован в службе, поскольку каждое поле хэшировано солено? Есть ли какие-либо недостатки в этом, поскольку в Интернете об этом мало?
Ответ №1:
Солить и хэшировать имена пользователей / адреса электронной почты не является стандартной практикой.
Это правда, что злоумышленник не сможет идентифицировать сохраненные имена пользователей / адреса электронной почты, если они будут солены и хэшированы перед хранением. Фактически, никто не сможет получить доступ к именам пользователей / электронным письмам (включая авторизованных пользователей, таких как системный администратор).
- Звучит безопасно, так почему же это проблема?
Когда пользователь пытается войти в систему, он отправляет имя пользователя (или электронную почту) и пароль. Поскольку каждая соль уникальна для этого конкретного имени пользователя, единственный способ связать имя пользователя / адрес электронной почты с сохраненным хэшем имени пользователя / email — это проверять каждую комбинацию соль хэш, пока не будет найдено совпадение или каждая запись не будет опробована / отклонена.
Хотя это может быть возможно для базы данных, состоящей из нескольких пользователей, на практике это неосуществимо, поскольку хэширование требует вычислительных затрат. Представьте, что служба входа в систему часами или днями ожидает вычисления каждой комбинации соль хэш только для того, чтобы обнаружить, что имя пользователя было просто написано с ошибкой.
Кроме того, если вы солите имена пользователей, то как вы предотвратите дублирование?
Имена пользователей должны быть уникальными. Если вы солите имя пользователя, у вас нет способа запретить нескольким пользователям использовать одно и то же имя пользователя.
- Какие еще методы может использовать разработчик для защиты информации?
Наиболее очевидным решением является шифрование базы данных. Хотя это немного выходит за рамки вашего вопроса, в Википедии есть хорошая статья, посвященная этой теме.
Комментарии:
1. Спасибо за четкий ответ. Ценю это! Имеет смысл!
2. @bsheps, что, если использовать одну и ту же соль для всех записей? Вы говорите «Поскольку каждая соль уникальна для этого конкретного имени пользователя» — и было бы разумно, если бы вы использовали ее для паролей. Но в этом случае намерение состоит в том, чтобы скрыть фактические адреса электронной почты.
3. Вы не хотите повторно использовать соль. Например, если у 2 пользователей (user1, user2) одинаковый пароль соль, хэшированное значение будет одинаковым. Если злоумышленник знает пароль пользователя 1 в виде открытого текста хэшированный пароль, то злоумышленник может сделать вывод, что у пользователя 2 такой же пароль. Дополнительная информация: en.wikipedia.org/wiki/Salt_ (криптография)#Salt_re-use
Ответ №2:
Хэширование и соление имен пользователей и адресов электронной почты не является обычным делом по нескольким причинам:
Удобство использования
Если ваш адрес электронной почты был хэширован, веб-сайт не смог бы отобразить ваш адрес электронной почты, поскольку значение хэшировано.
Безопасность
С точки зрения безопасности вы мало что выиграете, хэшируя свой адрес электронной почты. Представьте, что если бы у кого-то был доступ к вашему адресу электронной почты, он мог бы использовать тот же алгоритм хэширования и легко найти ваши учетные данные, выполнив итерацию по базе данных. Вот почему некоторые веб-сайты внедрили отдельные имя для аутентификации при входе и отображаемое имя. Имя входа остается хэшированным (несоленым), в то время как отображаемое имя сохраняется без хэша. Если у злоумышленника нет вашего имени для входа / адреса, нет никакого способа скомпрометировать ваши данные. В данном конкретном случае хэширование адресов электронной почты гарантирует полную безопасность ваших данных.