Все пользователи интернета ежедневно сталкиваются с сервисами, требующими авторизации, скажем даже прямей — среднестатический интернет-пользователь пользуется сотнями и более сайтов-сервисов,
совершенно разной функциональностью — интернет-магазины, банкинг, рабочая groupware, развлекательные блоги-социальные сети, сайты знакомств, обмен знаниями в форумах и вики-системах…
И до сих пор единственным распространенным способом авторизации является предъявление пароля — того, что можно спрятать в голове, то, что всегда с собой.
Возникает первая проблема — как выбрать пароль, чтобы он,
с одной стороны, укладывался в голове, и мог быть предъявлен по требованию, а не записывался на стикер, хранимый под клавиатурой (блокнот, флешку, внешний сервис хранения паролей — которые не только уязвимы для перехвата, но и могут просто потеряться и стать недоступными),
и не подбирался атакой по словарям — с другой.
Тут конфликт — трудноподбираемые пароли сложно запомнить, а легкозапоминаемые — уязвимы для подбора.
Да, многие придумывают свои собственные эвристики для «статистически невычислимых» паролей, используют безумные словосочетания, построенные на личных ассоциативных рядах, комбинируя с отражениями раскладок с русской на английскую, вставку цифр, любимые опечатки и т.п.
Но проблема усложняется тем, что нет никакой единой авторизации — каждый интернет-сервис ведет свой собственный учет аккаунтов.
И в большинстве случаев, они хранят пароли в исходном виде (по крайней мере, невозможно проверить, что это не так), так что доверяя им пароль, нужно быть готовым к тому, что произойдет его утечка[1]. Наверное читатель помнит недавно прошедшие громкие утечки паролей из vkontakte или из PHPBB.com.
И даже если потеря аккаунта в самом сервисе не видится пользователю проблемой — подумаешь, маловажный интернет-магазин, и полумертвый стартап, проблема будет в том, что грамотный dataminer может легко вычислить («Google-Yandex-Radarix—…») остальные аккаунты пользователя, которых принято привязывать к уникальному нику или emailу, и атаковать их, а это уже и приведет к существенным потерям — денег, репутации, информации или всего вместе взятого.
Примеры потерь репутации из-за взломов и деанонимизации некоторых аккаунтов, можно найти здесь.
Да, возникают очевидные идеи защиты.
Например, разделять в интернете общественно-одобряемую деятельность («AlexanderIvanov@mycompany.ru»), от, скажем, репутационно-сомнительной («BiBigOneMacho@gmail.com»), и от строго секретной (руление деньгами и собственностью).
Но проблема в том, что таких кластеров не может быть много, ведь голова-то не резиновая, а внутри такого кластера сохраняется уязвимость из-за утечки.
Некоторые пытаются строить уникальные пароли, основываясь на URLе интернет-ресурса, добавляя в пароль доменное имя или вычислимую от него в уме функцию,
Можно в функцию вводить и human-based эвристики, например, любимые опечатки («атнакласнеги»).
Но в любом случае, о легко вычислимой в уме функции, как вы видите, легко догадаться.
И ведь злоумышленник, если пароль не подойдет, сможет использовать полученные данные как наводку для угадывания других паролей, и пароли типа «ливжурналсолнце91» и «яндекссолнце91» прекрасно подскажут ему пароль в Google-сервисах.
А вдруг вы подозреваете компрометацию всех паролей? Нашли троян на компьютере, а в вашем броузере все пароли хранятся? Их надо менять, но как придумать разом новые пароли для всех ресурсов? Опять придется расходовать самый критичный ресурс — собственные нейроны.
Решение
Для доступности нижеследующего материала, некоторые сложные понятия будут излагаться намеренно упрощенным образом. Профессиональных криптографов просьба умерить негодование.
Итак, очевидны следующие требования:
должен быть уникальный пароль для каждого ресурса;
по перехваченному для одного ресурса паролю нельзя узнать пароль для другого ресурса.
пользователю легко и удобно достать этот пароль — вопрос пары секунд и пары нажатий клавиш, других телодвижений не требуется.
пароли нигде не хранятся и неуязвимы для перехвата (ни на зашифрованной флешке, ни на «спрятанном» документа в Google Docs, ни на специальном вебсервисе.
Из требований очевидно, что нужно призывать одностороннюю функцию, т.е. функцию от URL-а сайта (или его доменной части) и некоторого истинного секретного пароля, известного только пользователю, причем функция должна легко вычисляться компьютером (увы, человеку в уме это не под силу), но в обратную сторону даже компьютер не смог бы вычислить в обозримое время.
Что же вычислять? А главное как, чтобы вычислитель был всегда под рукой?
Специальная программа которую надо скачивать и ставить? — Вроде неудобно, опасно, может не быть прав на инсталляцию, плюс все опасности исполняемых программ.
Может расширение к броузеру? — Лучше, но тогда нужно, чтобы расширение работало под всеми распространенными броузерами, плюс опять риски, что расширение «окажется несовместимым» при обновлении броузера.
Веб-сервис? Терпимо, но лень куда-то специально заходить, плюс вдруг он откажет в нужный момент?
Решение есть! По сути, комбинация перечисленного. Самый простой тип «расширений», который поддерживают, можно сказать все броузеры, это букмарклеты, однострочные JavaScript-программы.
«Установить» их элементарно — простой drag-and-drop ссылки на панель ссылок, которая есть в любом броузере.
Запускается — по нажатию.
Автоматически вычисляет первый параметр одностронней функции, взяв URL из строки броузера.
Может спросить пользователя секретную часть пароля.
Можно ли вычислить на ней одностороннюю функцию? Да, на Javascript есть реализация MD5.
Что еще полезного может букмарклет? — Автоматически/полуавтоматически ввести вычисленный пароль в поля авторизационной формы.
Элементарно. Обратите внимание, что вам даже не нужно «проявлять» сгенерированный пароль и копипейстить его — просто нанесите «двойной удар по почкам мыши» в поле для пароля, и сгенерированный пароль сам скопируется туда.
Обратите также внимание, что вторая версия 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)andre.search("[A-Z]",password)andre.search("[0-9]",password)return PasswordOk
passwd=masterpass+':'+domain
for i inxrange(10):
passwd=MD5(passwd)whilenot 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-атака станет невозможной.
Майндмап
Если захотите сделать презентацию, убедить знакомых использовать — вот конспект-майндмап по теме.
↑Впрочем, утечка может произойти и не только по их вине — утечка паролей из броузера, вирусы-трояны-кейлоггеры…
Юмор
Не забывайте и про терморектальный криптоанализ:
Внимание! Эта статья была создана путем автоматического реплицирования из внутренней базы знаний компании Заказные Информ Системы. Любые правки этой статьи могут быть перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».