kNN за по-силни пароли

Как да създадете по-интелигентен тест за силата на паролата

Наскоро попаднах на изключително полезен инструмент за проверка на качеството на вашите пароли, haveibeenpwned.com. Въведете парола и тя автоматично се проверява в база данни от ~500 милиона изтекли пароли. Ако бъдат открити съвпадения, определено трябва да промените паролата си.

Нека да видим какво се случва, когато опитаме класическия correcthorsebatterystaple.

Най-малко 114 други души са използвали това и са били заплатени. Излишно е да казвам, че НЕ го ИЗПОЛЗВАЙТЕ (търпеливо ще изчакам, докато отидете да промените паролата си).

Да имаш инструмент като този е страхотно. Въпреки това, и донякъде за съжаление, се връщат само точни съвпадения. В база данни от 500 милиона пароли това може да не е голяма работа, тъй като е много вероятно всяка итерация на password, p4assw0rd, paSSwOrD,и т.н. вече да присъства. Но за по-редките пароли това не винаги е така. Например, нека да видим какво се случва, когато заменим първото o с 0в c0rrecthorsebatterystaple.

Както можете да видите, няма намерени съвпадения. Така че, напълно безопасно, нали? "Не точно. Оказва се, че повечето потенциални хакери на пароли са доста запознати с тази тактика и е лесно да се пробие с речникова атака. Затова би било чудесно, ако haveibeenhacked.com също ви уведоми, ако вашата парола е подобна на изтеклите.

Тук се намесва ~~машинното обучение~~.

Е, някак си... Докато бихме могли да изградим супер страхотна дълбока невронна мрежа с хиляди слоеве, обучени с помощта на някакъв вид контрастна загуба между добри и лоши пароли (и въпреки че това може или не може да работи), нека започнем с нещо по-просто, като k-най-близки съседи (kNN). Системата, която ще създадем, взема предоставена от потребителя парола и проверява дали тя е достатъчно подобна на някоя от паролите в нашата база данни с изтекли пароли. За да определим сходството, бихме могли да използваме всякакъв вид „метрика на разстоянието“, а тази, която изглежда доста подходяща за низове, е „разстоянието за редактиране“ (или разстоянието на Левенщайн, ако се опитвате да впечатлите приятелите си).

Всъщност бях изненадан да открия, че никоя от основните библиотеки за наука за данни (sklearn, numpy, scipy и т.н.) не предоставя това веднага. Може да има много причини за това и една от тях може да е, че не е много изчислително ефективен (поне това е моето предположение). Във всеки случай ще го внедрим сами, като се има предвид, че е сравнително просто:

Тази метрична функция е същността на нашата система, останалото е просто водопровод. Ако никога преди не сте писали kNN, това е може би най-лесният алгоритъм за машинно обучение за внедряване от нулата. Всъщност, тъй като това е непараметричен модел, дори не се извършва никакво обучение. Всичко, което прави, е да вземе вашите тестови данни, в нашия случай предоставената от потребителя парола, и да ги сравни с всяка отделна точка от данни за „обучение“, като използва показателя за разстояние. Ако две точки от данни са достатъчно близов пространството на разстоянието, тогава ги считаме за съседи. Ето как изглежда това в код:

Изглежда добре! Както може би сте забелязали, премълчахме важен детайл. Ако погледнете ред 15в кодовия фрагмент по-горе, ще видите, че имаме достъп до файл, наречен passwords.txt. Това е базата данни с изтекли пароли, която използваме, за да тестваме потребителската парола. Има много места за намиране на изтекли пароли онлайн и за целите на тази статия използвах този списък, който намерих в GitHub.

Всичко, което остава сега, е да свържем всичко заедно и ще имаме прост, но мощен модел за машинно обучение за прогнозиране на силата на паролата:

Въпреки че това върши работа, се оказва, че потребителите не са много запалени да въвеждат паролите си като обикновен текст на терминал. Вместо това нека използваме getpass, за да попитаме потребителя за неговата парола. Също така, ако намерим съвпадащи пароли, може да не искаме да ги показваме на терминала, тъй като би било доста лесно да извлечем потребителската парола от тези съвпадения. Вместо това нека направим тази опция достъпна само ако потребителят я поиска чрез флага show_matching. И накрая, ще добавим и копче за настройка на съвпадащия праг чрез флаг max_distance. Събирайки всичко заедно, имаме:

И накрая, нека да видим как нашата система може да се справи с крайния тест на c0rrecthorsebatterystaple.

хубаво! Успяхме да предупредим потребителя, че паролата му е слаба, без изобщо да сме видели точно съвпадение.

Заключение

С няколко реда код изградихме по-интелигентна система за прогнозиране на силата на паролата. Въпреки че това е пример за играчка, тези идеи имат потенциални приложения в реалния свят. Представете си, че когато създавате нов акаунт, вместо неясна евристика за това колко специални символа има вашата парола, тя е тествана за сходство с милионите вече известни лоши пароли. Може дори да се предоставя като услуга за други приложения, към които да изпращат заявки. Разбира се, ако сте сериозни за вашата онлайн сигурност, така или иначе трябва да използвате „мениджър на пароли“.

Това, което изградихме, може да бъде подобрено по няколко съществени начина, от ефективността на текущата система до самия алгоритъм. Сещате ли се за някои подобрения? Ако е така, целият код може да бъде намерен в моя GitHub. Чувствайте се свободни да разклонявате, крадете, изпращате PR или каквото и да е друго, което може да искате да направите с него.

И накрая, трябва да се разбира от само себе си, но моля, НЕ ИЗПОЛЗВАЙТЕ тази система за проверка на вашите действителни пароли и вместо това използвайте haveibeenpwned.com.

Благодаря за четенето!

Eugen Hotaj,
7 април 2019 г