Я поделюсь с вами несколько иначе.
Я всегда храню соль, смешанную с хешем паролей с солью.
Например, я помещу первую половину соли перед солёным хешем пароля, а последнюю половину соли после солёного хеша пароля. Приложение знает об этой конструкции, поэтому может извлекать эти данные и получать хеш-код соли и пароля.
Мое обоснование такого подхода:
Если пароль / хеш-данные будут скомпрометированы и попадут в руки злоумышленника, злоумышленник не узнает, в чем заключается соль, глядя на данные. Таким образом, злоумышленник практически не может выполнить атаку методом перебора, чтобы получить пароль, соответствующий хэшу, поскольку он не знает хэш для начала и не имеет возможности узнать, какие части данных являются частями соли, или части хэша соленого пароля (если он не знает логику аутентификации вашего приложения).
Если хэш соленого пароля хранится как есть, то может быть проведена атака грубой силой, чтобы получить пароль, который после соления и хеширования дает те же данные, что и хеш соленого пароля.
Однако, например, даже если хеш с соленым паролем хранился как есть, но с добавлением одного случайного байта, до тех пор, пока злоумышленник не знает, что этот первый байт должен быть отброшен, это также увеличило бы сложность. атаки. Ваше приложение будет знать, что нужно отбросить первый байт данных при использовании для аутентификации вашего пользователя.
Вывод к этому ..
1) Никогда не храните данные, которые использует ваше приложение аутентификации, в точном виде.
2) По возможности держите логику аутентификации в секрете для дополнительной безопасности.
Сделайте еще один шаг…
Если вы не можете сохранить в секрете логику аутентификации вашего приложения - многие люди знают, как ваши данные хранятся в базе данных. И предположим, что вы решили сохранить хеш соленого пароля, смешанный с солью, при этом часть соли добавляется к хешу соленого пароля, а остальная часть соли добавляет его.
При генерации случайной соли вы также можете случайным образом решить, какую часть соли вы будете хранить до / после хэша соленого пароля.
Например, вы генерируете случайную соль размером 512 байт. Вы добавляете соль к своему паролю и получаете хэш SHA-512 вашего соленого пароля. Вы также генерируете случайное целое число 200. Затем вы сохраняете первые 200 байтов соли, за которыми следует хеш соленого пароля, а затем остаток соли.
При аутентификации ввода пароля пользователя ваше приложение передаст строку и предположит, что первый 1 байт данных - это первый 1 байт соли, за которым следует соленый хеш. Этот проход не удастся. Приложение будет продолжать, используя первые 2 байта данных в качестве первых 2 байтов соли, и повторять до тех пор, пока не будет обнаружен положительный результат после использования первых 200 байтов в качестве первых 200 байтов соли. Если пароль неправильный, приложение будет продолжать пробовать все перестановки, пока ни одна не будет найдена.
Плюсы этого подхода:
Повышенная безопасность - даже если ваша логика аутентификации известна, точная логика неизвестна во время компиляции. Практически невозможно провести атаку полным перебором, даже зная точную логику. Увеличенная длина соли еще больше повысит безопасность.
Минусы этого подхода:
Поскольку точная логика выводится во время выполнения, этот подход очень загружает процессор. Чем больше длина соли, тем более интенсивным становится этот подход.
Аутентификация неверных паролей потребует наибольших затрат на процессор. Это может быть контрпродуктивным для законных запросов, но повышает безопасность от злоумышленников.
Этот подход может быть реализован различными способами, и его можно сделать еще более безопасным, используя соли переменной ширины и / или хеши паролей с солью.
person
Ibraheem
schedule
12.05.2013