Пост о том, как я пришел к методу генерации пароля password = base64(sha1(sal + salt + masterPassword))

Тот, кто однажды прочитал «Криптономикон», уже никогда не станет прежним. Роман в отличной литературной форме иллюстрирует основы криптографии и защиты приватности информации и переписки. Конечно, я вряд ли докачусь до того, что буду экранировать свой ноутбук фольгой от перехвата Ван Эйка. Но в свете недавних взломов и уязвимостей на dropbox, kernel.org, hetzner.de (там хостится мой сервер) стоит хотя бы озаботиться секьюрностью паролей.

Раньше я, как и многие, держал один пароль на все сайты. Это не был Qwerty123, или подобный. Он состоял из букв в верхнем и нижнем регистре и цифр, удобно набирался (соотношение символов с левой и правой части клавиатуры), но был один на все сайты. Если бы один сайт себя скомпрометировал, опасности подвергались аккаунты на остальных сайтах.

Я долго не переходил на систему 'один сайт — один пароль', потому что не смог бы их запомнить и не знал, как их хранить, предпочитая держать в голове один сложный пароль. Надо признать, что менеджеров паролей существует бесчисленное множество, но у всех у них есть недостаток в том, что они хранятся в базе, которую можно потерять либо взломать, или не иметь к ней доступа.

Решение подсказал cF8. Он сузил условия задачи: нужно залогиниться в твиттер с украденного айфона, чтобы сообщить о травле полицаев, и привел решение: md5 хэш на основе мастер-пароля и доменного имени.

Плюсы такого решения в независимости от реализации. MD5 шифрование имеет определенный алгоритм и кучу реализаций на разных платформах. Кроме того, при таком методе нам нужен всего один мастер-пароль. Минус решения в том, что при каждой авторизации надо снова генерировать пароль, а также иметь доступ к одной из реализаций md5 шифрования (для систем, где таковых не установлено придется использовать веб-сервис).

Это решение я немного углубил и расширил. MD5 — скомпрометированный алгоритм, лучше использовать SHA. Кроме того, надо принять во внимание, что на некоторых сайтах стоит ограничение на длину пароля и диапазон используемых символов, поэтому пароль не должен превышать 20 символов и иметь в себе буквы верхнего, нижнего регистра и цифры. Для добавления букв верхнего регистра, пропускаем полученный шифрованием хэш через base64-кодирование, а затем берем от сгенерированной последовательности первые 20 символов. На самом деле я бы посоветовал не пользоваться сайтами, где есть такие ограничения. Во-первых, это очевидное мудачество, во-вторых, это скорее всего означает, что в базе хранятся не хэши паролей, а сами пароли в открытом виде, а значит девелопер с привилегиями может залогиниться под вашей учеткой. К сожалению, среди сайтов с ограниченем на длину пароля - rutracker.org и livejournal.com.

На некоторых сайтах могут иметься несколько аккаунтов, поэтому надо добвить еще один аргумент — логин. Таким образом, для аккаунта fiskus на google.com будет браться хэш на основе слов "fiskus", "google.com" и секретного мастер-пароля. Для аккаунта juvvi на google.com — хэш на основе слов "juvvi", "google.com" и секретного мастер-пароля. В таком случае получится один пароль для одного логина, но разных протоколов (Google+, GMail, GTalk), мне кажется, что это нормально, тем более что в том же гугле нет возможности завести разные пароли для джаббера, почты и соц. сети.

Напоследок осталась проблема генерации пароля для системы, не имеющей домена, или имеющей несколько доменов, например, VPS или домашный компьютер. Ничего лучше не придумалось, чем брать вместо доменного имени имя хоста, предварительно придумав уникальные имена для всех своих компьютеров.


Существует также менее технологичное, и, соответственно, более независимое решение проблемы генерации паролей, основанное на использовании словарей.

Например, есть словарь, в котором каждая буква соответствует названию животного. Берем доменное имя, и заменяем первые три буквы названиями животных. Т.е. было twitter.com, стало Tiger_Whale_Iguanas_tter. Список животных можно взять в статье «What are some animals that begin with the letters A-Z?» на Answers.com. Вместо словаря животных, можно использовать стихотворение. Так как в стихотворении может не быть слов на определенную букву, то замены в доменном имени делаем не на основе самой буквы, а ее месте в алфавите. "T" - 20-я буква, "W"- 22-я, "I" - 9-я. Соответсвенно, подставляем 20-е, 22-е и 9-е слова из стихотворения.

Помимо того, что генерация пароля таким образом займет продолжительное время (возможно, без бумажки с карандашом не обойтись), за которое гэбня успеет сцапать и революционный твит не будет отослан, при плановой смене паролей придется выучивать новый словарь животных или новое стихотворение. Возникнет путаница, соответсвует ли буква 'T' слову 'tiger', или это было в прошлом месяце, а сейчас - 'tarantula'.

Поэтому я за первый вариант, реализация которого хостится на гитхабе. Второй актуален для людей, застрявших в начале 90-х, и из всех веб-сервисов, пользующихся только почтой.