Как могут взломать мой SUPERGENPASS

advertisement
«Полное и окончательное решение проблемы паролей в Интернет»
Содержание









1 Проблема
2 Решение
3 Инсталляция
4 Использование
5 Ответы на вопросы
 5.1 Фиг разберешься в коде этого букмарклета …
6 А точно проверяли эквивалентность Python/Javascript?
 6.1 А вдруг генеримый пароль будет тупым?
 6.2 А как ломают MD5? Как могут взломать мой SUPERGENPASSпароль?
 6.3 Misc
 6.4 Какие есть проблемы с SuperGenPass?
7 Майндмап
8 Примечания
9 Юмор
Проблема
Все пользователи интернета ежедневно сталкиваются с сервисами, требующими
авторизации, скажем даже прямей — среднестатический интернет-пользователь
пользуется
сотнями
и
более
сайтов-сервисов,
совершенно
разной
функциональностью — интернет-магазины, банкинг, рабочая groupware,
развлекательные блоги-социальные сети, сайты знакомств, обмен знаниями в
форумах и вики-системах…
И до сих пор единственным распространенным способом авторизации является
предъявление пароля — того, что можно спрятать в голове, то, что всегда с собой.
Возникает первая проблема — как выбрать пароль, чтобы он,


с одной стороны, укладывался в голове, и мог быть предъявлен по
требованию, а не записывался на стикер, хранимый под клавиатурой
(блокнот, флешку, внешний сервис хранения паролей — которые не только
уязвимы для перехвата, но и могут просто потеряться и стать недоступными),
и не подбирался атакой по словарям — с другой.
Тут конфликт — трудноподбираемые пароли
легкозапоминаемые — уязвимы для подбора.
сложно
запомнить,
а
Да, многие придумывают свои собственные эвристики для «статистически
невычислимых» паролей, используют безумные словосочетания, построенные на
личных ассоциативных рядах, комбинируя с отражениями раскладок с русской на
английскую, вставку цифр, любимые опечатки и т.п.
Но проблема усложняется тем, что нет никакой единой авторизации — каждый
интернет-сервис ведет свой собственный учет аккаунтов. И в большинстве случаев,
они хранят пароли в исходном виде (по крайней мере, невозможно проверить, что
это не так), так что доверяя им пароль, нужно быть готовым к тому, что произойдет
его утечка[1]. Наверное читатель помнит недавно прошедшие громкие утечки
паролей из vkontakte или из PHPBB.com.
И даже если потеря аккаунта в самом сервисе не видится пользователю проблемой
— подумаешь, маловажный интернет-магазин, и полумертвый стартап, проблема
будет в том, что грамотный dataminer может легко вычислить («Google-YandexRadarix—…») остальные аккаунты пользователя, которых принято привязывать к
уникальному нику или emailу, и атаковать их, а это уже и приведет к существенным
потерям — денег, репутации, информации или всего вместе взятого.
Примеры потерь репутации из-за взломов и деанонимизации некоторых
аккаунтов, можно найти здесь.
Да, возникают очевидные идеи защиты. Например, разделять в интернете
общественно-одобряемую деятельность («AlexanderIvanov@mycompany.ru»), от,
скажем, репутационно-сомнительной («BiBigOneMacho@gmail.com»), и от строго
секретной (руление деньгами и собственностью). Но проблема в том, что таких
кластеров не может быть много, ведь голова-то не резиновая, а внутри такого
кластера сохраняется уязвимость из-за утечки.
Некоторые пытаются строить уникальные пароли, основываясь на URLе интернетресурса, добавляя в пароль доменное имя или вычислимую от него в уме
функцию,
liveinternet.ru → l10t.ру
livejournal.com → kbdt;jehyfk/rjv
livejournal.ru ➨ru-l09l
yandex.ru
➨ru-y04x
gmail.com
➨com-g03l
Можно в функцию вводить и human-based эвристики, например, любимые опечатки
(«атнакласнеги»). Но в любом случае, о легко вычислимой в уме функции, как вы
видите, легко догадаться.
И ведь злоумышленник, если пароль не подойдет, сможет использовать
полученные данные как наводку для угадывания других паролей, и пароли типа
«ливжурналсолнце91» и «яндекссолнце91» прекрасно подскажут ему пароль в
Google-сервисах.
А вдруг вы подозреваете компрометацию всех паролей? Нашли троян на
компьютере, а в вашем броузере все пароли хранятся? Их надо менять, но как
придумать разом новые пароли для всех ресурсов? Опять придется расходовать
самый критичный ресурс — собственные нейроны.
Решение
Для доступности нижеследующего материала, некоторые сложные понятия
будут излагаться намеренно упрощенным образом. Профессиональных
криптографов просьба умерить негодование.
Итак, очевидны следующие требования:




должен быть уникальный пароль для каждого ресурса;
по перехваченному для одного ресурса паролю нельзя узнать пароль для
другого ресурса.
пользователю легко и удобно достать этот пароль — вопрос пары секунд и
пары нажатий клавиш, других телодвижений не требуется.
пароли нигде не хранятся и неуязвимы для перехвата (ни на зашифрованной
флешке, ни на «спрятанном» документа в Google Docs, ни на специальном
вебсервисе.
Из требований очевидно, что нужно призывать одностороннюю функцию, т.е.
функцию от URL-а сайта (или его доменной части) и некоторого истинного
секретного пароля, известного только пользователю, причем функция должна легко
вычисляться компьютером (увы, человеку в уме это не под силу), но в обратную
сторону даже компьютер не смог бы вычислить в обозримое время.
Что же вычислять? А главное как, чтобы вычислитель был всегда под рукой?



Специальная программа которую надо скачивать и ставить? — Вроде
неудобно, опасно, может не быть прав на инсталляцию, плюс все опасности
исполняемых программ.
Может расширение к броузеру? — Лучше, но тогда нужно, чтобы
расширение работало под всеми распространенными броузерами, плюс
опять риски, что расширение «окажется несовместимым» при обновлении
броузера.
Веб-сервис? Терпимо, но лень куда-то специально заходить, плюс вдруг
он откажет в нужный момент?
Решение есть! По сути, комбинация перечисленного. Самый простой тип
«расширений», который поддерживают, можно сказать все броузеры, это
букмарклеты, однострочные JavaScript-программы.






«Установить» их элементарно — простой drag-and-drop ссылки на панель
ссылок, которая есть в любом броузере.
Запускается — по нажатию.
Автоматически вычисляет первый параметр одностронней функции, взяв
URL из строки броузера.
Может спросить пользователя секретную часть пароля.
Можно ли вычислить на ней одностороннюю функцию? Да, на Javascript есть
реализация MD5.
Что еще полезного может букмарклет? — Автоматически/полуавтоматически
ввести вычисленный пароль в поля авторизационной формы.
Итак, встречайте — http://supergenpass.com !
Инсталляция
Использование
Элементарно. Обратите внимание, что вам даже не нужно «проявлять»
сгенерированный пароль и копипейстить его — просто нанесите «двойной удар по
почкам мыши» в поле для пароля, и сгенерированный пароль сам скопируется туда.
Обратите также внимание, что вторая версия SuperGenPass «видит» формы для
ввода пароля, и если они всплывают в его любимом правом верхнем углу, он нехотя
перебирается в левый.
Что же делать, если броузер lynx, или что-то вроде этого по функционалу
поддержки Javascript (старый мобильный телефон, например)? Ну тут уже можно
воспользоваться самим сайтом supergenpass.com, там есть форма для вычисления
пароля: http://supergenpass.com/mobile/.
Ответы на вопросы
Фиг разберешься в коде этого букмарклета …
Фиг разберешься в коде этого букмарклета (он несколько обфускирован для
минимизации размера) — вдруг он вычисляет не одностороннюю функцию, а какуюнибудь ерунду? Или наоборот, вдруг автор забросит проект и исчезнет со своим
сайтом с просторов интернета, букмарклеты потеряются — как вычислить
независимым образом пароли к моим сайтам?
Хороший вопрос. Мы провели реинжениринг этого обфускированного (для
меньшего веса) JavaScript кода, и представляем алгоритм на языке Python.
def MD5(password):
s=base64.encodestring(md5.new(password).digest())
s=s.replace("+","9")
s=s.replace("/","8")
s=s.replace("=","A")
s=s.replace("\n","")
return s
def supergenpass(domain,masterpass,length):
def goodPassword(password):
password=password[:length]
PasswordOk=re.search("^[a-z]",password) and re.search("[AZ]",password) and re.search("[0-9]",password)
return PasswordOk
passwd=masterpass+':'+domain
for i in xrange(10):
passwd=MD5(passwd)
while not goodPassword(passwd):
passwd=MD5(passwd)
return passwd[:length]
Вы всегда сможете вычислить свои SuperGenPass-пароли через Python (или что вы
там любите).
А точно проверяли эквивалентность
Python/Javascript?
А точно проверяли эквивалентность Python/Javascript?
Да, мы сгенерировали Python-программой тысячи случайных входных данных
для JS-программы из букмарклета, и проверяли на них.
А вдруг генеримый пароль будет тупым?
А вдруг генеримый пароль будет тупым? Вдруг случится так, что он будет
«12345678»? Я слышал, такие пароли легко массово подбирают с помощью
словарного перебора.
Посмотрите псевдокод/Python. Итерации генерации идут до тех под, пока пароль
не будет содержать латинские буквы в обеих регистрах и цифры. Пространство
подбора дешевым не будет, точно. С другой стороны отметим, пароль содержит
только кошерные символы — латиница и цифры, так что подойдет для любых
сервисов, даже тех, которые не допускают например, русскоязычных паролей.
А как ломают MD5? Как могут взломать мой SUPERGENPASSпароль?
А как ломают MD5? Как могут взломать мой SUPERGENPASS-пароль?
По сути основной метод атаки на MD5 — это вычисление и хранение всех
возможных результатов односторонней функции с некотороей оптимизацией путем
обмена времени на память (см. метод радужных таблиц). Но букмарклет
итеративно минимум 10 раз (может и больше, см. алгоритм) вычисляет MD5, плюс,
если вы очень беспокоитесь, можно проверить сгенерированный пароль в базах
хакеров в соответствующих сервисах (эти сайты-хранилища хешей постоянно
меняются, но легко нагуглить).
Misc
Чего-то я не догоняю: как это поможет, если на компе троян/кейлоггер?
Это поможет сменить резко все пароли. Не придется придумывать каждому
сервису новый пароль, меняешь только мастер-пароль.
Не понял мысли, как можно сменить резко все пароли? Сменив мастер пароль
все равно придется заходить на каждый сайт и пользоваться функцией смены
пароля, или у сервиса есть суперфункция?
Да, придется, это неизбежно в любом случае! Но вам не придется забивать
новыми паролями голову, речь именно об этом.
Чем это отличается от программы хранения паролей с одним мастер паролем?
Да практически ничем. Хакеру нужно знать функцию и мастер пароль, чтобы
получить доступ ко всему. Плюс яваскрипт на твоем компе, вдруг понадобится
ввести на чужом?
Отличается удобство доступа. Инсталляция букмарклета мгновенна,
мультиплатформенна, и без побочных эффектов возможных от выполняемой
программы. Это оптимальное по всем параметрам на данный момент решение.
И кстати, почему там base64, проще же в hex?
Чтобы пространство ваших паролей было
длина пароля.
, а не
, где n —
Какие есть проблемы с SuperGenPass?
Какие есть проблемы с SuperGenPass?
Ну, мне например, понадобилось время, чтобы перевести всю тыщу сайтов, где
уже зарегистрировался, со своих старых самопальных паролей, на новую систему.
И то, иногда встречаю сервис, где «уже был Вася Стас», но пароль еще старый,
пятилетней давности.
Майндмап
Если захотите сделать презентацию, убедить знакомых использовать — вот
конспект-майндмап по теме.
[на всё окно][свернуть]
Примечания
1. ↑ Впрочем, утечка может произойти и не только по их вине — утечка паролей
из броузера, вирусы-трояны-кейлоггеры…
Юмор
Не забывайте и про терморектальный криптоанализ:
Статья реплицируется в SMWiki, SBWiki, RDWiki, GZWiki, DPWiki, HRWiki, CBWiki, ORWiki, RAWiki, ITWiki,
CRMWiki, NordeaWiki, EvolWiki.
Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи,
запишите его в раздел «discussion».
Репликация: База Знаний «Заказных Информ Систем» → «SuperGenPass»
Download