Радужные / словарные атаки и соленые пароли - подход еретиков
Пароли не должны храниться в вашей базе данных. Не катите свой собственный механизм аутентификации - вы почти наверняка ошибетесь. Используйте Kereberos для ценных вещей, и в противном случае у меня нет хорошего предложения.
Тем не менее, этот вопрос некоторое время бился в моем черепе (см. Правку)
и я хотел бы изложить еретическую точку зрения.
Радужные таблицы являются так называемыми из-за способа использования механизма поиска (цепочки) - но они являются просто атаками по словарю. Миллионы слов и общих парольных фраз хэшируются, а затем используются для сравнения украденных хэшированных паролей.
Это хорошо работает для процесса паролей NT4, который использует хэши md5 и не использует соль. Но
когда соль добавляется к паролю перед хэшированием, тогда радужная таблица бесполезна - вместо поиска md5-хэша «mypass» она должна предварительно вычислить «mypass-random-string_of-letters»
Невозможно угадать, какую соль кто-то будет использовать, поэтому соление делает радужные таблицы как универсальные, которые можно использовать где угодно против любого серверного решения, погибшего в воде.
но ...
Это только один вариант использования - безусловно, большая угроза, безусловно, от которой нужно защищаться Но
у солей есть проблема. Вы должны хранить соль, когда вы хотите аутентифицироваться при следующем входе пользователя в систему. Они отправляют свой открытый текст (через ssl!), Вы добавляете соль и хэш, comapre к хэшу, хранящемуся в базе данных. Но если вы не держите соль с паролем, вы не сможете этого сделать, и ошибка ... нет логина
Но мы не только защищаемся от людей, проходящих вокруг стола, предназначенного для взлома паролей NT4. Мы должны защищать наших пользователей индивидуально.
Соль добавляет двухфакторную защиту к паролям - даже в случае хэша злоумышленнику потребуется соль, чтобы иметь возможность его взломать. Но стандартный совет просто отказывается от двухфакторной защиты Возможно, это разумно, но я не уверен.
За этим стоит математика. Обычный совет (также предоставленный RSA - ftp.rsa.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf) - это сборка 64-битной соли, храните ее вместе с
хешированный пароль Таким образом, вы можете повторно подтвердить пароль, перефразировав его с солью, и отменить хэш практически невозможно.
NB - я могу ошибаться ...
Бит «почти невозможно» происходит из простой математики.
Давайте предположим, что пароль состоит из 8 цифр и содержит 62 возможных символа (буквы, верхний нижний и цифры)
То есть 62 ^ 8 комбинаций, или чуть более 200 миллионов триллионов.
Для грубой силы путем непосредственного вычисления хеша (т.е. составления моих радужных таблиц для соли) я должен увидеть столкновение после 62 ^ 8/2, и, скажем, 100 хешей в секунду, это займет около 12 миллионов дней. , Да дней.
ОК, поэтому даже сохранение хеша с паролем делает задачу нахождения хеша совершенно неосуществимой.
Однако в вышеприведенном есть некоторые предположения. Во-первых, пароль является случайным выбором диапазона 62 ^ 8. На практике большинство паролей намного слабее - радужные таблицы на самом деле не основаны на всех возможностях 62 ^ 8 - они построены из словарей и таблиц реальных паролей, найденных за эти годы.
Таким образом, пространство поиска вместо 62 ^ 8 действительно меньше. Как маленький? Зависит от пароля "сила".
Существует около 250 000 - 750 000 слов на английском языке (http://oxforddictionaries.com/page/93). Давайте возьмем 500 000 в качестве простого случая. Затем давайте возьмем варианты, которые можно применить - добавить цифру, добавить год, преобразовать гласные в цифры. Это дает нам произнесите 3 возможных новых слова на слово или 2 миллиона возможных паролей.
Генерирование 2 миллионов хешей со скоростью 100 в секунду дает 20000 секунд или 5 часов - в пределах досягаемости любого ноутбука.
Таким образом, если нацеливается конкретный пользователь (root, admin, spolsky и т. Д.), То сохранение соли с паролем немедленно делает возможным взлом.
Хранение соли в стороне от пароля увеличивает сложность взлома - не любым математическим способом, просто в трудности получения соли и пароля.Можно было бы предусмотреть отдельный сервер, который просто принимает открытый текст, имя пользователя и хэш, и ищет соль, используемую на дату присоединения этого пользователя, и возвращает 1/0
Итак, вкратце, если вы храните соль спароль и кто-то получает доступ к паролям, затем, в зависимости от надежности пароля, каждый пароль может быть взломан в течение разумного периода времени.Разная соль для каждого пользователя защищает всех других пользователей, но если вам нужна определенная учетная запись, это не имеет значения.Если хакер использует только один пароль, сохранение соли с паролем делает возможным взлом.Хранение вращающейся соли в другом месте таблицы паролей означает, что хакеру теперь нужны два кражи данных для взлома пароля, потому что без соли любая атака обречена на тысячи лет работы.
Это все компромисс -принуждение людей к использованию 15-значных паролей означает, что все они размещаются на экране или становятся «легко запоминающимися», то есть словами.
В этот момент вы также можете перейти на Kerberos или аналогичный - еслиданные, которые вы защищаете, являются ценными, и пользователи их поймут и оценят.Если нет, то почему мы беспокоимся?
Но я все же рекомендую вам , а не реализовать свой собственный механизм аутентификации.Используйте Kerberos, используйте полуобщественную PKI, не катите свою собственную.Я понятия не имею, как определить, просто ли мой сервер поменял оперативную память, удерживая соль на диске, и это единственная ошибка, о которой я могу сразу подумать при развертывании собственной аутентификации.
HTH