хранение пароля в mysql для пользовательского сайта контента - PullRequest
1 голос
/ 03 ноября 2010

Для хранения пользовательских паролей я собираюсь в SHA 256 + солить. Просто хотел подтвердить, если это правильно. Бизнес-требование - пароль должен быть минимум 8 входов и максимум 32 входа. (любой ввод действителен, кроме пробела)

Таким образом, чтобы удовлетворить эти требования, план:
Front end - проверить максимальный вход 32 и минимальный вход 8.

Схема базы данных (MySQL) будет:
pass_hash (64) CHAR - сохранить хэш пароля
pass_slt (32) VARCHAR - хранить уникальную соль для каждого пользователя

Что касается соления, я еще не уверен, какую ценность использовать. Но я думаю, что когда пользователи создают учетную запись, я создам случайный символ для каждого пользователя и использую его. Тогда другой вопрос: я храню соль в виде простого текста или мне тоже нужно ее хешировать / шифровать?

Кроме того, я не знаю, имеет ли это значение, но могут ли пароли поддерживать несколько языков с этим текущим планом, или я столкнусь с какими-либо проблемами? (Я говорю о таких прикольных персонажах, как арабский, китайский и т. Д.)

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

По солям:

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

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

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

Уникальность солей легко обеспечивается использованием достаточно больших случайных солей. Для этого более чем 32-байтовых солей достаточно: риск выбора дважды одной и той же соли (из-за неудачи) ничтожен.

Дополнительный уровень безопасности, помимо засолки, состоит в том, чтобы сделать хеширование пароля "дорогим". Например, когда вы хэшируете (соленый) пароль, вы фактически хешируете конкатенацию в 10000 раз больше последовательности соль + пароль. Это делает проверку пароля в 10000 раз дороже, как для вас, так и для злоумышленника. Часто бывает так, что законная проверка пароля может быть более сложной в вычислительном отношении без заметного эффекта (даже если вы проверяете 100 пользовательских паролей в секунду, вы все равно можете посвятить этому 100 мкс, и она будет использовать только 1% вашего времени обработки), но сделать атакующему в 10000 раз тяжелее - хорошая идея.

На языках:

Основная проблема с паролями, отличными от ASCII, заключается в том, что некоторые глифы могут использовать несколько кодировок. Например, 'é' может быть закодировано с помощью Unicode в виде одной кодовой точки (U + 00E9 МАЛЕНЬКОЕ ПИСЬМО E С ОСТРОМ) или в виде двух кодовых точек (U + 0065 ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО E, за которым следует U + 0301 КОМБИНИРОВАНИЕ ОСТРЫЙ АКЦЕНТ). Обратите внимание, что в этом примере речь идет о довольно распространенном французском письме, ничем не более таком (компьютерном), как китайское или корейское. Проблемы с кодированием можно решить с помощью форм нормализации Unicode , но это не простая задача программирования. Могут помочь некоторые среды программирования (например, в Java используйте java.text.Normalizer, который реализует UNF).

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

Я бы порекомендовал попытаться применить пароли только к ASCII, если это возможно, или иным образом прикусить пулю: выполнить UNF (с формой NFD), затем кодировать UTF-8. В результате получается последовательность байтов, которая переходит на этап хеширования.

0 голосов
/ 03 ноября 2010

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

Что касается мультиязычности, вы должны просто быть последовательными в том, какую кодировку символов вы используете в своем приложении, а какую ровно вы звоните в SHA-256.

...