SuperGenPass
«Полное и окончательное решение проблемы паролей в Интернет»
Содержание
Проблема
Все пользователи интернета ежедневно сталкиваются с сервисами, требующими авторизации, скажем даже прямей — среднестатический интернет-пользователь пользуется сотнями и более сайтов-сервисов, совершенно разной функциональностью — интернет-магазины, банкинг, рабочая groupware, развлекательные блоги-социальные сети, сайты знакомств, обмен знаниями в форумах и вики-системах…
И до сих пор единственным распространенным способом авторизации является предъявление пароля — того, что можно спрятать в голове, то, что всегда с собой.
Возникает первая проблема — как выбрать пароль, чтобы он,
- с одной стороны, укладывался в голове, и мог быть предъявлен по требованию, а не записывался на стикер, хранимый под клавиатурой (блокнот, флешку, внешний сервис хранения паролей — которые не только уязвимы для перехвата, но и могут просто потеряться и стать недоступными),
- и не подбирался атакой по словарям — с другой.
Тут конфликт — трудноподбираемые пароли сложно запомнить, а легкозапоминаемые — уязвимы для подбора.
Да, многие придумывают свои собственные эвристики для «статистически невычислимых» паролей, используют безумные словосочетания, построенные на личных ассоциативных рядах, комбинируя с отражениями раскладок с русской на английскую, вставку цифр, любимые опечатки и т.п.
Но проблема усложняется тем, что нет никакой единой авторизации — каждый интернет-сервис ведет свой собственный учет аккаунтов. И в большинстве случаев, они хранят пароли в исходном виде (по крайней мере, невозможно проверить, что это не так), так что доверяя им пароль, нужно быть готовым к тому, что произойдет его утечка[1]. Наверное читатель помнит недавно прошедшие громкие утечки паролей из vkontakte или из PHPBB.com.
И даже если потеря аккаунта в самом сервисе не видится пользователю проблемой — подумаешь, маловажный интернет-магазин, и полумертвый стартап, проблема будет в том, что грамотный dataminer может легко вычислить («Google-Yandex-Radarix—…») остальные аккаунты пользователя, которых принято привязывать к уникальному нику или 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("[A-Z]",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?
Вообще, возможна специализированная атака на SuperGenPass — Javascript-кейлоггер на сайте, считывающий поля из DOM-структуры или просто записывающий все нажатия клавиш. Вот обсуждение. Пока это маловероятно (специальный сайт, чтобы поймать SGP-пользователей, которых копейки), но если вы настолько ценная цель, и известно, что вы используете SGP, то возможно будет фишинг, подмена DNS, и специальный сайт с таким перехватчиком. Тогда надо
- Использовать NoScript, блокирующий JS у непроверенных сайтов (хотя бы на момент запуска SGP).
- Использовать либо онлайн-версию SGP, или SuperGenPass-расширения для броузеров, либо вот такие вариации скрипта [1] (которые работают в отдельных окнах).
- Или, как сделал я — сделайте легкую модификацию скрипта — просто замените все подстроки 'gp2_master' на любую длинную строку, которая вам придет в голову — тогда специализированная антиSGP-атака станет невозможной.
Майндмап
Если захотите сделать презентацию, убедить знакомых использовать — вот конспект-майндмап по теме.
Примечания
- ↑ Впрочем, утечка может произойти и не только по их вине — утечка паролей из броузера, вирусы-трояны-кейлоггеры…
Юмор
Не забывайте и про терморектальный криптоанализ:
Репликация: База Знаний «Заказных Информ Систем» → «SuperGenPass»
Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».