2009-09-24 16 views
12

Присоединяйтесь ко мне в борьбе со слабыми хэшами пароля.Есть ли стандарт для использования PBKDF2 в качестве хэша паролей?

Хэш пароля PBKDF2 должен содержать соль, количество итераций и сам хэш, поэтому можно проверить позже. Существует ли стандартный формат, например RFC2307 {SSHA}, для хэшей паролей PBKDF2? BCRYPT замечательный, но PBKDF2 проще реализовать.

По-видимому, нет спецификации. Итак, вот моя спецификация.

>>> from base64 import urlsafe_b64encode 
>>> password = u"hashy the \N{SNOWMAN}" 
>>> salt = urlsafe_b64decode('s8MHhEQ78sM=') 
>>> encoded = pbkdf2_hash(password, salt=salt) 
>>> encoded 
'{PBKDF2}1000$s8MHhEQ78sM=$hcKhCiW13OVhmLrbagdY-RwJvkA=' 

Update: http://www.dlitz.net/software/python-pbkdf2/ определяет замену crypt(). Я обновил свою маленькую спецификацию, чтобы соответствовать ему, кроме его стартов с $p5k2$ вместо {PBKDF2}. (Мне нужно перейти от других типов LDAP {SCHEMES}).

Это {PBKDF2}, число итераций в нижнем регистре шестнадцатеричное, $, то urlsafe_base64 кодируются соль, $, и кодированный выходной PBKDF2 urlsafe_base64. Соль должна быть 64 бита, количество итераций должно быть не менее 1000, а выход PBKDF2 с выходом HMAC-SHA1 может быть любой длины. В моей реализации по умолчанию всегда 20 байтов (длина хэша SHA-1).

Пароль должен быть закодирован до utf-8 перед отправкой через PBKDF2. Нет слов о том, следует ли его нормализовать в NFC Unicode.

Эта схема должна быть порядка iterations раз более дорогостоящей для грубой силы, чем {SSHA}.

+1

Через некоторое время после того, как я это написал, я узнал о замене склепа на SHA, используемом в RedHat Linux. Вероятно, он лучше разработан, чем рассматриваемая схема PBKDF2. http://en.wikipedia.org/wiki/Crypt_%28Unix%29#SHA-based_scheme – joeforker

ответ

4

Существует спецификация параметров (соль и итерации) PBKDF2, но она не включает хэш. Это включено в PKCS #5 version 2.0 (см. Приложение A.2). Некоторые платформы имеют встроенную поддержку для кодирования и декодирования этой структуры ASN.1.

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

Но для использования в качестве одностороннего хэша пароля хэш может храниться в записи с параметрами, но в ее собственном поле.

4

Я присоединяюсь к вам в борьбе со слабыми хэшами.

OWASP имеет защитный чехол для хранения пароля (https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) с некоторым руководством; они рекомендуют 64 000 итераций PBKDF2 по состоянию на 2012 год, удваивая каждые два года (т. е. 90 510 в 2012 году).

Обратите внимание, что хранение длинной криптографически случайной соли для каждого пользователя всегда является основным.

Обратите внимание, что при использовании переменного числа итераций с переменной частотой и сохранении количества итераций вместе с солью будет добавлена ​​некоторая сложность для взлома программного обеспечения и может исключить определенные оптимизации. Например, «bob» зашифровывается с помощью итераций 135817, тогда как «alice» использует 95121 итераций, то есть, возможно, минимум (90510 + RAND (90510)) для 2013 года.

Обратите также внимание, что все это бесполезно, если пользователи разрешено выбирать слабые пароли, такие как «пароль», «Пароль1!»,« P @ $$ w0rd »и« P @ $$ w0rd123 », все из которых будут найдены с помощью основанных на правилах словарных атак очень быстро (последний просто« пароль »со следующими правилами: прописная первая буква, 1337-говорите, добавьте трехзначный номер в конец). Возьмите базовый список словарей (phpbb, для хорошего, небольшого стартового словаря) и примените к нему правила, подобные этому, и вы взломаете большое количество паролей, «умные» трюки.

Таким образом, при проверке новых паролей не просто применяйте «Все четыре цифры сверху, снизу, цифры, цифры не менее 11 символов», так как «P @ $$ w0rd123» соответствует это, по-видимому, очень жесткое правило. Вместо этого используйте этот базовый список словарей и посмотрите, будут ли его исправлять базовые правила (это намного проще, чем на самом деле пытаться взломать - вы можете сократить свой список и их слово, а затем просто написать код типа " если последние 4 символа - общий год, chec k всех, кроме последних четырех символов, против слова списка ", и" если последние 3 символа являются цифрами, проверьте все, кроме последних 3 символов, на список слов "и" проверьте все, кроме двух последних символов, на словосочетание "и" 1337 пароль - превратите @ в a, 3 в e и т. Д., А затем проверьте его на список слов и попробуйте другие правила ».

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

Обратите внимание, что современные машины с графическим процессором рассчитаны на десятки миллиардов итераций хэша (MD5, SHA1, SHA-256, SHA-512 и т. Д.) В секунду, даже в 2012 году. Что касается словосочетания «правильно» лошади батарея штапеля ", это, в лучшем случае, очень скромный пароль - это всего 4 слова в нижнем регистре длиной 7 или меньше с пробелами. Итак, если мы ищем поисковые пароли XKCD с 18-миллиметровой догадкой второй установки: современный маленький англо-английский словарь имеет: 6k слов длиной 5 или менее 21k слов длиной 7 или менее 36k слов длиной 9 или менее 46k слов длиной 11 или менее 49 тыс. слов длиной 13 или менее

С кодовой фразой в стиле XKCD и без необходимости фильтровать слова по популярности («правильное» или «стул» против «дампье» против «геморрообразования») мы имеем 21k^4, что имеет только около 2E17 возможностей. С установкой 18 миллиардов/сек (единственная машина с 8 GPU, если мы сталкиваемся с одной итерацией SHA1), это составляет около 4 месяцев, чтобы полностью искать пространство ключей. Если бы у нас было десять таких установок, это примерно две недели. Если бы мы исключили маловероятные слова типа «дампье», это намного быстрее для быстрого первого прохода.

Теперь, если вы получаете слова из «огромного» словаря английского языка английского языка, такого как «Бальзамина» или «Кальвинистика» (оба выбраны с помощью функции «перейти к строке», тогда у нас будет 30 тыс. Слов длиной 5 или менее 115 тыс. слов длиной 7 или менее 231 тыс. слов длиной 9 или менее 317 тыс. слов длиной 11 или менее 362 тыс. слов длиной 13 или менее

Даже с максимальным пределом длины 7 с этим огромным словарем как базовое и случайно выбранное слова, мы имеем 115k^4 ~ = 1.8E20 возможностей, или около 12 лет, если установка будет обновлена ​​(удвоение мощности каждые 18 месяцев). Это очень похоже на 13 символов, в нижнем регистре + только номер. «300 лет» - это то, что вам скажут большинство оценок, но они не учитывают закон Мура.

+1

Этот чит-лист выглядит полезным. Ваше сообщение заканчивается в середине предложения, вы можете это исправить? Кроме того, как вы относитесь к passPHRASES вместо passWORDS? См. Http://xkcd.com/936/ –

+1

Я просто объединил два полу ответа от @ Anti-weakpasswords в один ответ. Я не внес никаких изменений, просто скопировал другой пост и вставил его здесь. – user9876

Смежные вопросы