Персональные инструменты
 

Полное и окончательное решение проблемы паролей в Интернет — различия между версиями

Материал из CustisWiki

Перейти к: навигация, поиск
м (1 версия)
м (Использование)
Строка 1: Строка 1:
 
 
==Проблема==
 
==Проблема==
  
 
Все пользователи интернета ежедневно сталкиваются с сервисами, требующими авторизации, скажем даже прямей — среднестатический интернет-пользователь пользуется сотнями и более сайтов-сервисов,  
 
Все пользователи интернета ежедневно сталкиваются с сервисами, требующими авторизации, скажем даже прямей — среднестатический интернет-пользователь пользуется сотнями и более сайтов-сервисов,  
 
совершенно разной функциональностью — интернет-магазины, банкинг, рабочая groupware, развлекательные блоги-социальные сети, сайты знакомств, обмен знаниями в форумах и вики-системах…  
 
совершенно разной функциональностью — интернет-магазины, банкинг, рабочая groupware, развлекательные блоги-социальные сети, сайты знакомств, обмен знаниями в форумах и вики-системах…  
 +
 +
[[Image:too-many-cookies-in-browser.flv|center]]
 +
  
 
И до сих пор единственным распространенным способом авторизации является предъявление пароля — того, что можно спрятать в голове, то, что всегда с собой.
 
И до сих пор единственным распространенным способом авторизации является предъявление пароля — того, что можно спрятать в голове, то, что всегда с собой.
Строка 15: Строка 17:
  
 
Но проблема усложняется тем, что нет никакой единой авторизации — каждый интернет-сервис ведет свой собственный учет аккаунтов.  
 
Но проблема усложняется тем, что нет никакой единой авторизации — каждый интернет-сервис ведет свой собственный учет аккаунтов.  
И в большинстве случаев, они хранят пароли в исходном виде (по крайней мере, невозможно проверить, что это не так), так что доверяя им пароль, нужно быть готовым к тому, что произойдет его утечка<ref>Впрочем, утечка может произойти и не только по их вине — утечка паролей из броузера, вирусы-трояны-кейлоггеры…</ref>.
+
И в большинстве случаев, они хранят пароли в исходном виде (по крайней мере, невозможно проверить, что это не так), так что доверяя им пароль, нужно быть готовым к тому, что произойдет его утечка<ref>Впрочем, утечка может произойти и не только по их вине — утечка паролей из броузера, вирусы-трояны-кейлоггеры…</ref>. Наверное читатель помнит недавно прошедшие [http://bugtraq.ru/rsn/archive/2009/07/13.html громкие утечки паролей из vkontakte] или [http://www.securitylab.ru/news/367767.php из PHPBB.com].
  
 
И даже если потеря аккаунта в самом сервисе не видится пользователю проблемой — подумаешь, маловажный интернет-магазин, и полумертвый стартап, проблема будет в том, что грамотный dataminer может легко вычислить («Google-Yandex-Radarix—…») остальные аккаунты пользователя, которых принято привязывать к уникальному нику или emailу, и атаковать их, а это уже и приведет к существенным потерям — денег, репутации, информации или всего вместе взятого.
 
И даже если потеря аккаунта в самом сервисе не видится пользователю проблемой — подумаешь, маловажный интернет-магазин, и полумертвый стартап, проблема будет в том, что грамотный dataminer может легко вычислить («Google-Yandex-Radarix—…») остальные аккаунты пользователя, которых принято привязывать к уникальному нику или emailу, и атаковать их, а это уже и приведет к существенным потерям — денег, репутации, информации или всего вместе взятого.
 +
 +
{{warning}} Примеры потерь репутации из-за взломов и деанонимизации некоторых аккаунтов, можно найти [http://lurkmore.ru/%D0%A5%D0%B5%D0%BB%D0%BB здесь].
  
 
Да, возникают очевидные идеи защиты.
 
Да, возникают очевидные идеи защиты.
Строка 24: Строка 28:
  
 
Некоторые пытаются строить уникальные пароли, основываясь на URLе интернет-ресурса, добавляя в пароль доменное имя или ''вычислимую от него в уме'' функцию,  
 
Некоторые пытаются строить уникальные пароли, основываясь на URLе интернет-ресурса, добавляя в пароль доменное имя или ''вычислимую от него в уме'' функцию,  
  liveinternet.ru -> l10t.ру
+
  liveinternet.ru l10t.ру
  livejournal.com -> kbdt;jehyfk/rjv
+
  livejournal.com kbdt;jehyfk/rjv
 +
livejournal.ru ➨ru-l09l
 +
yandex.ru      ➨ru-y04x
 +
gmail.com      ➨com-g03l
 +
 
 +
Можно в функцию вводить и ''human-based'' эвристики, например, любимые опечатки («атнакласнеги»).
 +
Но в любом случае, о легко вычислимой в уме функции, как вы видите, легко догадаться.
 +
 
 +
И ведь злоумышленник, если пароль не подойдет, сможет использовать полученные данные как наводку для угадывания других паролей, и пароли типа «ливжурналсолнце91» и «яндекссолнце91» прекрасно подскажут ему пароль в Google-сервисах.
 +
 
 +
А вдруг вы подозреваете компрометацию всех паролей? Нашли троян на компьютере, а в вашем броузере все пароли храняться? Их надо менять, но как придумать разом новые пароли для всех ресурсов? Опять придется расходовать самый критичный ресурс — собственные нейроны.
 +
 
 +
==Решение==
 +
{{caution}} Для доступности нижеследующего материала, некоторые сложные понятия будут излагаться намеренно упрощенным образом. Профессиональных криптографов просьба умерить негодование.
 +
 
 +
Итак, очевидны следующие требования:
 +
* должен быть уникальный пароль для каждого ресурса;
 +
* по перехваченному для одного ресурса паролю нельзя узнать пароль для другого ресурса.
 +
* пользователю легко и удобно достать этот пароль — вопрос пары секунд и пары нажатий клавиш, других телодвижений не требуется.
 +
* пароли нигде не храняться и неуязвимы для перехвата (ни на зашифрованной флешке, ни на «спрятанном» документа в Google Docs, ни на специальном вебсервисе.
 +
 
 +
Из требований очевидно, что нужно призывать [[RuPedia:Односторонняя функция|одностороннюю функцию]], т.е. функцию от URL-а сайта (или его доменной части) и некоторого истинного секретного пароля, известного только пользователю, причем функция должна легко вычисляться компьютером (увы, человеку в уме это не под силу), но в обратную сторону даже компьютер не смог бы вычислить в обозримое время.
 +
 
 +
Что же вычислять? А главное как, чтобы вычислитель был всегда под рукой?
 +
* {{question}} Специальная программа которую надо скачивать и ставить?  — Вроде неудобно, опасно, может не быть прав на инсталляцию, плюс все опасности исполняемых программ.
 +
* {{question}} Может расширение к броузеру? — Лучше, но тогда нужно, чтобы расширение работало под всеми распространенными броузерами, плюс опять риски, что расширение «окажется несовместимым» при обновлении броузера.
 +
* {{question}} Веб-сервис? Терпимо, но лень куда-то специально заходить, плюс вдруг он откажет в нужный момент?
 +
 
 +
{{note}} Решение есть! По сути, комбинация перечисленного. Самый простой тип «расширений», который поддерживают, можно сказать все броузеры, это [[RuPedia:Букмарклет|букмарклеты]], однострочные JavaScript-программы.
 +
* «Установить» их элементарно — простой ''drag-and-drop'' ссылки на панель ссылок, которая есть в любом броузере.
 +
* Запускается — по нажатию.
 +
* Автоматически вычисляет первый параметр одностронней функции, взяв URL из строки броузера.
 +
* Может спросить пользователя секретную часть пароля.
 +
* Можно ли вычислить на ней одностороннюю функцию? Да, на Javascript есть реализация [[RuPedia:MD5|MD5]].
 +
* Что еще полезного может букмарклет? — Автоматически/полуавтоматически ввести вычисленный пароль в поля авторизационной формы.
 +
 
 +
Итак, встречайте — http://supergenpass.com !
 +
 
 +
 
 +
== Инсталляция ==
 +
 
 +
[[Image:Supergenpassinstall-x264.avi.flv|center]]
 +
 
 +
== Использование ==
 +
Элементарно. Обратите внимание, что вам даже не нужно «проявлять» сгенерированный пароль и копипейстить его — просто нанесите «двойной удар по почкам мыши» в поле для пароля, и сгенерированный пароль сам скопируется туда.
 +
 
 +
[[Image:supergenpass-using.flv|center]]
 +
 
 +
{{caution}} Обратите также внимание, что вторая версия SuperGenPass «видит» формы для ввода пароля, и если они всплывают в его любимом правом  верхнем углу, он нехотя перебирается в левый.
 +
 
 +
{{question}} Что же делать, если броузер <tt>lynx</tt>, или что-то вроде этого по функционалу поддержки Javascript (старый мобильный телефон, например)? Ну тут уже можно воспользоваться самим сайтом <tt>supergenpass.com</tt>, там есть форма для вычисления пароля: http://supergenpass.com/mobile/.
 +
 
 +
== Ответы на вопросы ==
 +
 
 +
=== Фиг разберешься в коде этого букмарклета … ===
 +
{{question}} Фиг разберешься в коде этого букмарклета (он несколько обфускирован для минимизации размера)  — вдруг он вычисляет не одностороннюю функцию, а какую-нибудь ерунду? Или наоборот, вдруг автор забросит проект и исчезнет со своим сайтом с просторов интернета, букмарклеты потеряются — как вычислить независимым образом пароли к моим сайтам?
 +
 
 +
{{note}} Хороший вопрос. Мы провели реинжениринг этого обфускированного (для меньшего веса) JavaScript кода, и представляем алгоритм на языке [[Python]].
 +
 
 +
<code-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]
 +
 
 +
</code-python>
 +
Вы всегда сможете вычислить свои SuperGenPass-пароли через Python (или что вы там любите).
 +
 
 +
==А точно проверяли эквивалентность Python/Javascript? ==
 +
 
 +
{{question}} А точно проверяли эквивалентность Python/Javascript?
 +
 
 +
{{note}} Да, мы сгенерировали Python-программой тысячи случайных входных данных для JS-программы из букмарклета, и проверяли на них.
 +
 
 +
 
 +
[[Image:Testjs-x264-2.avi.flv|center]]
 +
 
 +
=== А вдруг генеримый пароль будет тупым? ===
 +
{{question}} А вдруг генеримый пароль будет тупым? Вдруг случится так, что он будет «12345678»? Я слышал, такие пароли легко массово подбирают с помощью словарного перебора.
 +
 
 +
{{note}} Посмотрите псевдокод/Python. Итерации генерации идут до тех под, пока пароль не будет содержать латинские буквы в обеих регистрах и цифры. Пространство подбора дешевым не будет, точно.
 +
С другой стороны отметим, пароль содержит только кошерные символы — латиница и цифры, так что подойдет для любых сервисов, даже тех, которые не допускают например, русскоязычных паролей.
 +
 
 +
=== А как ломают MD5? Как могут взломать мой SUPERGENPASS-пароль? ===
 +
{{question}} А как ломают MD5? Как могут взломать мой SUPERGENPASS-пароль?
 +
 
 +
{{note}} По сути основной метод атаки на MD5 — это вычисление и хранение всех возможных результатов односторонней функции с некотороей оптимизацией путем обмена времени на память (см. [[RuPedia:Радужная таблица|метод радужных таблиц]]).
 +
Но букмарклет итеративно минимум 10 раз (может и больше, см. алгоритм) вычисляет MD5, плюс, если вы очень беспокоитесь, можно проверить сгенерированный пароль в <s>базах хакеров</s> в соответствующих сервисах (эти сайты-хранилища хешей постоянно меняются, но легко нагуглить).
 +
 
 +
=== Какие есть проблемы с SuperGenPass? ===
 +
{{question}} Какие есть проблемы с SuperGenPass?
 +
 
 +
{{note}} Ну, мне например, понадобилось время, чтобы перевести всю тыщу сайтов, где уже зарегистрировался, со своих старых самопальных паролей, на новую систему. И то, иногда встречаю сервис, где «уже был <s>Вася</s> Стас», но пароль еще старый, пятилетней давности.
 +
 
 +
== Майндмап ==
  
О легко вычислимой в уме функции, как вы видите, легко догадаться.
+
Если захотите сделать презентацию, убедить знакомых использовать — вот конспект-майндмап по теме.
  
Но ведь злоумышленник, если пароль не подойдет, сможет использовать полученные данные как наводку для угадывания других паролей, и пароли типа «ливжурналсолнце91» и «яндекссолнце91» прекрасно подскажут ему пароль в Google-сервисах.
+
<mm>[[supergenpass.mm]]</mm>
  
 
== Примечания ==
 
== Примечания ==

Версия 22:48, 9 сентября 2009

Проблема

Все пользователи интернета ежедневно сталкиваются с сервисами, требующими авторизации, скажем даже прямей — среднестатический интернет-пользователь пользуется сотнями и более сайтов-сервисов, совершенно разной функциональностью — интернет-магазины, банкинг, рабочая groupware, развлекательные блоги-социальные сети, сайты знакомств, обмен знаниями в форумах и вики-системах…


И до сих пор единственным распространенным способом авторизации является предъявление пароля — того, что можно спрятать в голове, то, что всегда с собой.

Возникает первая проблема — как выбрать пароль, чтобы он,

  • с одной стороны, укладывался в голове, и мог быть предъявлен по требованию, а не записывался на стикер, хранимый под клавиатурой (блокнот, флешку, внешний сервис хранения паролей — которые не только уязвимы для перехвата, но и могут просто потеряться и стать недоступными),
  • и не подбирался атакой по словарям — с другой.

Тут конфликт — трудноподбираемые пароли сложно запомнить, а легкозапоминаемые — уязвимы для подбора.

Да, многие придумывают свои собственные эвристики для «статистически невычислимых» паролей, используют безумные словосочетания, построенные на личных ассоциативных рядах, комбинируя с отражениями раскладок с русской на английскую, вставку цифр, любимые опечатки и т.п.

Но проблема усложняется тем, что нет никакой единой авторизации — каждый интернет-сервис ведет свой собственный учет аккаунтов. И в большинстве случаев, они хранят пароли в исходном виде (по крайней мере, невозможно проверить, что это не так), так что доверяя им пароль, нужно быть готовым к тому, что произойдет его утечка[1]. Наверное читатель помнит недавно прошедшие громкие утечки паролей из vkontakte или из PHPBB.com.

И даже если потеря аккаунта в самом сервисе не видится пользователю проблемой — подумаешь, маловажный интернет-магазин, и полумертвый стартап, проблема будет в том, что грамотный dataminer может легко вычислить («Google-Yandex-Radarix—…») остальные аккаунты пользователя, которых принято привязывать к уникальному нику или emailу, и атаковать их, а это уже и приведет к существенным потерям — денег, репутации, информации или всего вместе взятого.

Attention niels epting.svg Примеры потерь репутации из-за взломов и деанонимизации некоторых аккаунтов, можно найти здесь.

Да, возникают очевидные идеи защиты. Например, разделять в интернете общественно-одобряемую деятельность («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-сервисах.

А вдруг вы подозреваете компрометацию всех паролей? Нашли троян на компьютере, а в вашем броузере все пароли храняться? Их надо менять, но как придумать разом новые пароли для всех ресурсов? Опять придется расходовать самый критичный ресурс — собственные нейроны.

Решение

Caution.svg Для доступности нижеследующего материала, некоторые сложные понятия будут излагаться намеренно упрощенным образом. Профессиональных криптографов просьба умерить негодование.

Итак, очевидны следующие требования:

  • должен быть уникальный пароль для каждого ресурса;
  • по перехваченному для одного ресурса паролю нельзя узнать пароль для другого ресурса.
  • пользователю легко и удобно достать этот пароль — вопрос пары секунд и пары нажатий клавиш, других телодвижений не требуется.
  • пароли нигде не храняться и неуязвимы для перехвата (ни на зашифрованной флешке, ни на «спрятанном» документа в Google Docs, ни на специальном вебсервисе.

Из требований очевидно, что нужно призывать одностороннюю функцию, т.е. функцию от URL-а сайта (или его доменной части) и некоторого истинного секретного пароля, известного только пользователю, причем функция должна легко вычисляться компьютером (увы, человеку в уме это не под силу), но в обратную сторону даже компьютер не смог бы вычислить в обозримое время.

Что же вычислять? А главное как, чтобы вычислитель был всегда под рукой?

  • Question.svg Специальная программа которую надо скачивать и ставить? — Вроде неудобно, опасно, может не быть прав на инсталляцию, плюс все опасности исполняемых программ.
  • Question.svg Может расширение к броузеру? — Лучше, но тогда нужно, чтобы расширение работало под всеми распространенными броузерами, плюс опять риски, что расширение «окажется несовместимым» при обновлении броузера.
  • Question.svg Веб-сервис? Терпимо, но лень куда-то специально заходить, плюс вдруг он откажет в нужный момент?

Note.svg Решение есть! По сути, комбинация перечисленного. Самый простой тип «расширений», который поддерживают, можно сказать все броузеры, это букмарклеты, однострочные JavaScript-программы.

  • «Установить» их элементарно — простой drag-and-drop ссылки на панель ссылок, которая есть в любом броузере.
  • Запускается — по нажатию.
  • Автоматически вычисляет первый параметр одностронней функции, взяв URL из строки броузера.
  • Может спросить пользователя секретную часть пароля.
  • Можно ли вычислить на ней одностороннюю функцию? Да, на Javascript есть реализация MD5.
  • Что еще полезного может букмарклет? — Автоматически/полуавтоматически ввести вычисленный пароль в поля авторизационной формы.

Итак, встречайте — http://supergenpass.com !


Инсталляция

Использование

Элементарно. Обратите внимание, что вам даже не нужно «проявлять» сгенерированный пароль и копипейстить его — просто нанесите «двойной удар по почкам мыши» в поле для пароля, и сгенерированный пароль сам скопируется туда.

Caution.svg Обратите также внимание, что вторая версия SuperGenPass «видит» формы для ввода пароля, и если они всплывают в его любимом правом верхнем углу, он нехотя перебирается в левый.

Question.svg Что же делать, если броузер lynx, или что-то вроде этого по функционалу поддержки Javascript (старый мобильный телефон, например)? Ну тут уже можно воспользоваться самим сайтом supergenpass.com, там есть форма для вычисления пароля: http://supergenpass.com/mobile/.

Ответы на вопросы

Фиг разберешься в коде этого букмарклета …

Question.svg Фиг разберешься в коде этого букмарклета (он несколько обфускирован для минимизации размера) — вдруг он вычисляет не одностороннюю функцию, а какую-нибудь ерунду? Или наоборот, вдруг автор забросит проект и исчезнет со своим сайтом с просторов интернета, букмарклеты потеряются — как вычислить независимым образом пароли к моим сайтам?

Note.svg Хороший вопрос. Мы провели реинжениринг этого обфускированного (для меньшего веса) 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?

Question.svg А точно проверяли эквивалентность Python/Javascript?

Note.svg Да, мы сгенерировали Python-программой тысячи случайных входных данных для JS-программы из букмарклета, и проверяли на них.


А вдруг генеримый пароль будет тупым?

Question.svg А вдруг генеримый пароль будет тупым? Вдруг случится так, что он будет «12345678»? Я слышал, такие пароли легко массово подбирают с помощью словарного перебора.

Note.svg Посмотрите псевдокод/Python. Итерации генерации идут до тех под, пока пароль не будет содержать латинские буквы в обеих регистрах и цифры. Пространство подбора дешевым не будет, точно. С другой стороны отметим, пароль содержит только кошерные символы — латиница и цифры, так что подойдет для любых сервисов, даже тех, которые не допускают например, русскоязычных паролей.

А как ломают MD5? Как могут взломать мой SUPERGENPASS-пароль?

Question.svg А как ломают MD5? Как могут взломать мой SUPERGENPASS-пароль?

Note.svg По сути основной метод атаки на MD5 — это вычисление и хранение всех возможных результатов односторонней функции с некотороей оптимизацией путем обмена времени на память (см. метод радужных таблиц). Но букмарклет итеративно минимум 10 раз (может и больше, см. алгоритм) вычисляет MD5, плюс, если вы очень беспокоитесь, можно проверить сгенерированный пароль в базах хакеров в соответствующих сервисах (эти сайты-хранилища хешей постоянно меняются, но легко нагуглить).

Какие есть проблемы с SuperGenPass?

Question.svg Какие есть проблемы с SuperGenPass?

Note.svg Ну, мне например, понадобилось время, чтобы перевести всю тыщу сайтов, где уже зарегистрировался, со своих старых самопальных паролей, на новую систему. И то, иногда встречаю сервис, где «уже был Вася Стас», но пароль еще старый, пятилетней давности.

Майндмап

Если захотите сделать презентацию, убедить знакомых использовать — вот конспект-майндмап по теме.

<mm>supergenpass.mm</mm>

Примечания

  1. Впрочем, утечка может произойти и не только по их вине — утечка паролей из броузера, вирусы-трояны-кейлоггеры…



Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».

Репликация: База Знаний «Заказных Информ Систем» → «Полное и окончательное решение проблемы паролей в Интернет»