Як я можу оцінити ентропію пароля?


14

Прочитавши різні ресурси про надійність пароля, я намагаюся створити алгоритм, який дасть приблизну оцінку кількості ентропії пароля.

Я намагаюся створити максимально всебічний алгоритм. На даний момент у мене є лише псевдокод, але алгоритм охоплює наступне:

  • довжина пароля
  • повторені символи
  • шаблони (логічні)
  • різні символьні пробіли (LC, UC, Numeric, Special, Extended)
  • словникові атаки

Він НЕ охоплює наступне, і ДОЛЖЕН би охоплювати його добре (хоча і не ідеально):

  • впорядкування (паролі можна суворо упорядкувати шляхом виведення цього алгоритму)
  • шаблони (просторові)

Чи може хтось дати деяке розуміння того, до чого цей алгоритм може бути слабким? Зокрема, чи може хтось думати про ситуації, коли подача пароля в алгоритм перевершила б його силу? Заниження - це менше питання.

Алгоритм:

// the password to test
password = ?
length = length(password)

// unique character counts from password (duplicates discarded)
uqlca = number of unique lowercase alphabetic characters in password
uquca = number of uppercase alphabetic characters
uqd   = number of unique digits
uqsp  = number of unique special characters (anything with a key on the keyboard)
uqxc  = number of unique special special characters (alt codes, extended-ascii stuff)

// algorithm parameters, total sizes of alphabet spaces
Nlca = total possible number of lowercase letters (26)
Nuca = total uppercase letters (26)
Nd   = total digits (10)
Nsp  = total special characters (32 or something)
Nxc  = total extended ascii characters that dont fit into other categorys (idk, 50?)

// algorithm parameters, pw strength growth rates as percentages (per character)
flca = entropy growth factor for lowercase letters (.25 is probably a good value)
fuca = EGF for uppercase letters (.4 is probably good)
fd   = EGF for digits (.4 is probably good)
fsp  = EGF for special chars (.5 is probably good)
fxc  = EGF for extended ascii chars (.75 is probably good)

// repetition factors.  few unique letters == low factor, many unique == high
rflca = (1 - (1 - flca) ^ uqlca)
rfuca = (1 - (1 - fuca) ^ uquca)
rfd   = (1 - (1 - fd  ) ^ uqd  )
rfsp  = (1 - (1 - fsp ) ^ uqsp )
rfxc  = (1 - (1 - fxc ) ^ uqxc )

// digit strengths
strength =
( rflca * Nlca + 
  rfuca * Nuca +
  rfd   * Nd   +
  rfsp  * Nsp  +
  rfxc  * Nxc    ) ^ length

entropybits = log_base_2(strength)

Кілька входів та їх бажані та фактичні виходи entropy_bits:

INPUT           DESIRED        ACTUAL
aaa             very pathetic  8.1
aaaaaaaaa       pathetic       24.7
abcdefghi       weak           31.2
H0ley$Mol3y_    strong         72.2
s^fU¬5ü;y34G<   wtf            88.9
[a^36]*         pathetic       97.2
[a^20]A[a^15]*  strong         146.8
xkcd1**         medium         79.3
xkcd2**         wtf            160.5

* these 2 passwords use shortened notation, where [a^N] expands to N a's.
** xkcd1 = "Tr0ub4dor&3", xkcd2 = "correct horse battery staple"

Алгоритм розуміє (правильно), що збільшення розміру алфавіту (навіть на одну цифру) значно зміцнює довгі паролі, як показано різницею entropy_bits для 6-го та 7-го паролів, які обидва складаються з 36 a, але 21-го другого є з великої літери. Однак вони не враховують той факт, що наявність пароля 36 a - це не дуже гарна ідея, його легко зламати за допомогою слабкого злому пароля (і той, хто дивиться його, набере це), і алгоритм цього не відображає .

Однак це відображає той факт, що xkcd1 є слабким паролем порівняно з xkcd2, незважаючи на більшу щільність складності (це навіть річ?).

Як я можу вдосконалити цей алгоритм?

Додаток 1

Атаки на словники та атаки на основі шаблону, здається, є найбільшою справою, тому я буду брати участь у їх вирішенні.

Я міг би здійснити комплексний пошук через пароль для слів зі списку слів і замінити слова на лексеми, унікальні для зображених ними слів. Слово-лексеми розглядаються як символи та мають власну систему ваги, і вони додаватимуть власні ваги до пароля. Мені знадобляться кілька нових параметрів алгоритму (я буду називати їх lw, Nw ~ = 2 ^ 11, fw ~ = .5 та rfw), і я би врахував вагу в паролі, як і будь-який інший ваги.

Цей пошук слів може бути спеціально модифікований, щоб відповідати як малі, так і великі літери, а також звичайні підстановки символів, як у E на 3. Якби я не додав зайвої ваги таким зібраним словам, алгоритм трохи занизив би їхню силу або два на слово, що гаразд. В іншому випадку загальним правилом буде для кожного не ідеального поєднання символів давати слову бонусний біт.

Тоді я міг би провести просту перевірку шаблону, наприклад пошук запусків повторних символів та похідні тести (візьміть різницю між кожним символом), які б ідентифікували такі шаблони, як 'aaaaa' та '12345', і замінили кожен виявлений шаблон на шаблон маркер, унікальний за малюнком і довжиною. Алгоритмічні параметри (конкретно, ентропія на рисунок) можна генерувати на льоту на основі шаблону.

У цей момент я б взяв довжину пароля. Кожен маркер слова та маркер візерунку вважатимуться одним символом; кожен маркер замінив би символи, які вони символічно представляли.

Я склав якесь позначення візерунка, але воно включає довжину візерунка l, порядок візерунка o та базовий елемент b. Ця інформація може бути використана для обчислення деякої довільної ваги для кожного шаблону. Я б зробив щось краще в фактичному коді.

Модифікований приклад:

Password:          1234kitty$$$$$herpderp
Tokenized:         1 2 3 4 k i t t y $ $ $ $ $ h e r p d e r p
Words Filtered:    1 2 3 4 @W5783 $ $ $ $ $ @W9001 @W9002
Patterns Filtered: @P[l=4,o=1,b='1'] @W5783 @P[l=5,o=0,b='$'] @W9001 @W9002

Breakdown:         3 small, unique words and 2 patterns
Entropy:           about 45 bits, as per modified algorithm

Password:          correcthorsebatterystaple
Tokenized:         c o r r e c t h o r s e b a t t e r y s t a p l e
Words Filtered:    @W6783 @W7923 @W1535 @W2285

Breakdown:         4 small, unique words and no patterns
Entropy:           43 bits, as per modified algorithm

Точна семантика того, як обчислюється ентропія за шаблонами, готується до обговорення. Я думав про щось на кшталт:

entropy(b) * l * (o + 1) // o will be either zero or one

Змінений алгоритм знайде недоліки та зменшить міцність кожного пароля в початковій таблиці, за винятком s^fU¬5ü;y34G<, який не містить слів чи шаблонів.


2
Ви бачили tech.dropbox.com/?p=165 ? Це може дати вам кілька ідей. Демонструється демонстрація на сайті dl.dropbox.com/u/209/zxcvbn/test/index.html і код знаходиться на github.


Одним із варіантів може бути запуск їх за допомогою алгоритму стиснення і перегляд того, наскільки добре вони стискаються, єдиний привід тут полягає в тому, що більшість алгоритмів стиснення розроблені для роботи з великими обсягами даних, і вам потрібен такий для невеликих обсягів даних
jk.

1
@mouviciel: Я побив тебе до удару. Прочитайте перший рядок: D
Вуг

@Wug - Чудово! Я не перейшов за посиланням: не міг уявити, що різні ресурси охоплюють такі дослідження!
mouviciel

Відповіді:


9

Додаток A на p46 NIST SP 800-63 розповідає про роботу Клода Шеннона , який оцінює ентропію паролів, використовуючи ряд біт. Дійсно, це документ, який мультфільм XKCD використовує для обчислення біт ентропії. Конкретно:

  • ентропія першого символу приймається за 4 біти;
  • ентропія наступних 7 символів - 2 біти на символ; це приблизно відповідає оцінці Шеннона, що "при розгляді статистичних ефектів, що поширюються на не більше 8 букв, ентропія становить приблизно 2,3 біта на знак";
  • для символів з 9 по 20 число ентропії вважається рівним 1,5 біта на символ;
  • для символів 21 і вище ентропія вважається 1 біт на символ;
  • "Бонус" з 6 біт ентропії призначається правилу композиції, яке вимагає як великих букв, так і не алфавітних символів. Це змушує використовувати ці символи, але у багатьох випадках ці символи виникатимуть лише на початку або в кінці пароля, і це дещо скорочує загальний простір пошуку, тому вигода, ймовірно, скромна і майже не залежить від довжини пароль;
  • Бонус до 6 біт ентропії додається за широку перевірку словника. Якщо зловмисник знає словник, він може уникнути тестування цих паролів і, в будь-якому випадку, зможе здогадатися велику частину словника, який, однак, буде найімовірнішим обраним паролем за відсутності правила словника. Припущення полягає в тому, що більшість переваг ентропії здогадки для тесту словника нараховують відносно короткі паролі, оскільки будь-який довгий пароль, який можна запам'ятати, обов'язково повинен бути "фразовою фразою", що складається зі словникових слів, тому бонус знижується до нуля при 20 символів.

Ідея полягає в тому, щоб система аутентифікації вибирала певні рівні ентропії в якості порогових значень. Наприклад, 10 біт може бути слабким, 20 середнім і 30 сильним (числа, вибрані довільно як приклад, а не рекомендація). На жаль, документ не рекомендує таких порогових значень, мабуть, тому, що обчислювальна потужність, доступна для грубої сили або вгадування паролів, збільшується з часом:

В якості альтернативи нав'язуванню деякого довільного специфічного набору правил система аутентифікації може оцінювати паролі користувачів, використовуючи правила, зазначені вище, та приймати будь-які, що відповідають деякому мінімальному стандарту ентропії. Наприклад, припустимо, що вам потрібні паролі, принаймні 24-бітові ентропії. Ми можемо обчислити оцінку ентропії "IamtheCapitanofthePina4", спостерігаючи, що рядок містить 23 символи і задовольняє правилу композиції, що вимагає великих літер і не алфавітних символів.

Це може бути або не бути тим, що ви шукаєте, але не є поганою орієнтиром, якщо нічого іншого.

[Редагувати: Додано наступне.]

У статті Тестування метрик для політики створення паролів шляхом атаки великих наборів розкритих паролів (Метт Вейр, Судгір Агарвалваль, Майкл Коллінз та Генрі Стерн) продемонстрували описану вище модель Шеннона, що не є точною моделлю ентропії для створених людиною паролів. Я рекомендую переглянути "Розділ 5 Створення нових політик створення пароля" для більш точних пропозицій.


3
У статті Вікіпедії про міцність паролів зазначено, що ці правила були неточними для створених людиною паролів.
Рятал

1
Правда ( goo.gl/YxRk для цікавого читання).
akton

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

4

Перегляньте вихідний код для KeePass внизу цієї сторінки . У QualityEstimationкласі реалізує досить хороший алгоритм , який , як видається, відповідно до тим, що ви хочете мати на місці. Мої результати виглядають як такі:

aaa                              8
aaaaaaaaa                        9
abcdefghi                       18
H0ley$Mol3y_                    73
s^fU¬5ü;y34G<                   99
[a^36]*                         10
[a^20]A[a^15]*                  18
Tr0ub4dor&3                     66
correct horse battery staple    98

Чи обчислює це ентропія чи інша метрика, як, можливо, богофіт? Ви також пам’ятали про те, щоб розширити [a ^ 36] на «aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa» так?
Вуг

Е, ні, я скопіював ці рядки дослівно :( Я повністю вважав, що це круте використання спеціальних символів, а не регулярний вираз з першого погляду. Я дам йому ще раз знімок та оновлення. По-друге, він обчислює біти ентропії, так .
Jesse C. Slicer

1
Це було не стільки регулярним виразом, скільки дивними позначеннями, якими я користувався, щоб уникнути необхідності посмакувати мою таблицю 25 символами
Wug

2
Мені довелося поставити +1 до цього коментаря за "enfatten". Здається, це ідеально кромулентне слово для цієї ситуації.
Jesse C. Slicer

1
Насправді написано "KeePass", а не "KeyPass". (Я б просто змінив редагування, але їх повинно бути більше 6 символів ...)
Ian Dunn

1

Ви запитаєте

Зокрема, чи може хтось думати про ситуації, коли подача пароля в алгоритм перевершила б його силу?

Але у вас є приклад у питанні. За дизайном, xkcd2 має ~ 44 біт ентропії, але ваша оцінка становить 160,5 біт.


Отже, узагальнюючи, алгоритм руйнується при розгляді слів або комбінацій символів, які значно частіше використовуються, ніж інші. Я також зазначу, що приклад канонічного xkcd не включає пробіли, і мій розрахунок зробив.
Вуг

@Wug, це справедливе узагальнення. Це щось, що вирішується zxcvbn, про що йдеться в першому коментарі до цього питання.
Пітер Тейлор

1

Чи може хтось дати деяке розуміння того, до чого цей алгоритм може бути слабким? Зокрема, чи може хтось думати про ситуації, коли подача пароля в алгоритм перевершила б його силу?

Ви натякнули на деякі в преамбулі (атаки словника тощо). По суті, існує ряд загальних практик, про які може вгадати зловмисник, що значно зменшує простір пошуку. Я майже впевнений, що ваш алгоритм "переоцінить" наступне:

  • скрізь
  • Скрізь
  • Скрізь1

Пароль досить довгий, але тривіально складний, оскільки оригінальне слово з'являється в базовому словнику, а модифікації вважаються достатньо поширеними, щоб скласти частину будь-якої гідної атаки словника. Типові перетворення літер -> число (тобто 3v3rywh3r3) також слід вважати досить слабкими, і за це слід штрафувати.

Набагато меншою мірою можуть бути й інші паролі неполадок, які мають очевидні зразки, такі як:

  • abcdefghijklmnop
  • abcde12345

Хоча вони, ймовірно, менш націлені на фактичні напади на словники, вони страждають від подібних проблем, як ваш приклад "ааааа ...".

Я не впевнений, чи фразові паролі в даний час націлені в більшості атак на словник, але, без сумніву, по мірі набуття популярності вони будуть націлені все більше і більше. Я думаю, що відомий приклад xkcd враховує це, оскільки для кожного "загального слова" призначено лише 11 біт. Ваш алгоритм також завищує ці типи паролів.

Отже, підсумовуючи, алгоритм виконує досить хорошу роботу з оцінки, але це дійсно повинно враховувати структуру пароля та загальні, відомі зразки.


Один рівень перевірки похідних ідентифікує всі ці закономірності.
Вуг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.