Идея на тему генерации и запоминания надёжных паролей

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

    Требования к паролю

    Во-первых надо понять, каким требованиям должен отвечать хороший пароль:
    1. Должен быть трудноподбираемым. Он должен быть достаточно длинным и содержать символы разных типов (большие/маленькие буквы, цифры, спецсимволы), чтобы нельзя было подобрать полным перебором. Должен быть неподбираемым по словарю, словарю с комбинациями и мутациями.
    2. Должен быть уникальным для каждого аккаунта, так что компрометация пароля от одного аккаунта, не приведёт к несанкционированному доступу к другим аккаунтам.
    3. Должен периодически меняться.

    Сначала я подумал, что можно делать так: запомнить одну случайную последовательность символов и для каждого сайта пристыковывать к ней строку, специфическую именно для данного сайта. Например брать каждый третий символ адреса сайта. Пароль на хабр (вводится на id.tmtm.ru) будет выглядеть таким образом: «Q9y:y>1W.tr», где «Q9y:y>1W» — строка, используемая на всех сайтах, а ".tr" — добавка, специфичная именно для id.tmtm.ru. Фактически здесь две секретные составляющие: сам алгоритм генерации и случайная строка. Для получения пароля надо знать обе. Пароль вполне себе стойкий к перебору, можно периодически менять случайную стоку — требования (1) и (3) выполняются. Проблема в том, что об обеих составляющих можно относительно легко догадаться, зная пароли от пары сайтов.

    Общий алгоритм

    Следующий шаг — использование необратимых криптографических функций. Секретным здесь будет только случайная строка — мастер-пароль.
    Исходными данными для генерации пароля будут:
    • Мастер-пароль — секретная строка долговременного использования, должен быть достаточно сложным для противостояния перебору на любом кластере ;-)
    • Сайт — адрес сайта/имя компьютера — куда логинимся
    • Номер версии пароля для этого сайта — нужен в том случае, если потребуется сменить пароль для этого конкретного сайта.
    • Логин — может пригодиться если есть несколько аккаунтов на одном сайте/компьютере (так что пароли от разных учёток совпадать не будут). Так же логин работает как соль для защиты от перебора по радужным таблицам.
    Про таблицы
    Имеется ввиду атака, когда нарушитель каким-либо образом (фишинг, соц. инженерия, уязвимость сайта,...) может получать пароли от какого-либо популярного сайта. В таком случае для получения мастер-паролей тех пользователей, которые пользуются таким генератором паролей, но не заполняют поле логин, он может сгенерировать радужные таблицы и перебирать по ним. Конечно, такая атака имеет смысл только при широком распространении использования этого генератора паролей.

    Эти данные подаём на вход хэш-функции, выход рассматриваем как длинное целое число, кодируем его в 95ричной системе счисления, получаем псевдослучайную строку длиной 25 символов для 160 битной хэш-функции. Старший символ лучше откинуть, т.к. он может принимать далеко не все значения (точнее — только 5 значений). Получаем 24 псевдослучайных симовола.
    Точнее про распределение символов
    На самом деле распределение вероятностей по возможным значениям символов там будет не совсем равномерным за счёт того, что 2^160 не является степенью 95. Получится, что часть символов будет появляться с бОльшей вероятностью, чем другие. Но эта неравномерность будет очень быстро (экспоненциально) убывать от старших разрядов к младшим. Так (в предположении что хэш-функция идеальная и все значения её выхода равновероятны) на 24ой (старшей) позиции символы будут появляться с вероятностями 1.158011% и 1.051510%. На 23-ей позиции — с вероятностями 1.053724%, 1.051753% и 1.051510%. На 22-ой позиции — с вероятностями 1.052652%, 1.052639% и 1.052629%. Дальше разница будет ещё меньше. Для паролей такие отклонения от равномерного распределения значения практически не имеют.


    Конкретная реализация

    Тут лежит простенькая консольная программа на Python3, которая таким образом генерирует пароли.
    Можно указать один из параметров:
    -m — сгенерировать много паролей из одного мастер-пароля (чтобы не вводить мастер пароль несколько раз);
    -r — сгенерировать случайный пароль (источник случайности — системные генераторы случайных последовательностей и строка, вводимая с клавиатуры);
    без параметров — сгенерировать один пароль и выйти.
    Сразу после ввода мастер-пароля программа выводит 2х байтный хэш от мастер-пароля. Это нужно для контроля правильности ввода. Если хэш кажется незнакомым, значит мастер-пароль введён неправильно.
    В этой программе используются 2 разные хэш-функции (ripemd160 и sha512) и несколько более замороченный порядок скармливания им исходных данных, чем просто конкатенация строк. Использование двух функций — ход для параноиков — позволяет (насколько я вижу) сохранить криптостойкость алгоритма даже при обнаружении очень серьёзной уязвимости в одной из них (понятно, что это практически невероятно, но накладные расходы на такую «параною» тоже минимальны).
    Точный алгоритм
    SitePwd = ripemd160(ver2str(version) + sha512_hex(ver2str(version) + master_password + site + login) + site)
    Все текстовые строки кодируются UTF-8; ' + ' означает конкатенацию строк.
    Функция ver2str(n) возвращает строку, состоящую из записанных подряд n+1 последовательных чисел от n до 0, например:
    ver2str(0) = '0'
    ver2str(4) = '43210'
    ver2str(12) = '1211109876543210'

    SitePwd дальше преобразуется в длинное целое число, которое записывается в 95-ричной системе счисления. В качестве 95-ричных цифр используются символы из массива chars (всего 95 символов):
    chars = "`1234567890-=\~!@#$%^&*()_+|qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:"zxcvbnm,./ZXCVBNM<>? "
    (Без внешних кавычек, последний символ — пробел)
    24 младших разряда полученной записи, выведенные в порядке слева на право от младших к старшим, и являются сгенерированным паролем.


    Практически проблемы при использовании таких паролей

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

    Сравнение с «запоминалками» паролей

    Плюсы такого алгоритма по сравнению с «запоминалками» паролей:
    • Не нужно иметь под рукой базу паролей. Понадобилось на другом компьютере получить пароль — просто скачал с гитхаба программу, вбил свой мастер-пароль — и вся база паролей с собой.
    • Отсутствует файл, который злоумышленник может украсть и попытаться расшифровать. Правда в хорошей запоминалке с хорошим мастер-паролем дешифрование базы паролей так же практически невероятно.
    • Даже в случае получения полного доступа к вашему компьютеру (с чтением всех файлов и установкой кейлогеров) злоумышленнику ещё придётся отгадывать данные ваших аккаунтов (особенно тех, в которые с этого компьютера не заходят)
    • Гарантирует использование разных и случайных паролей. И придумывать пароль каждый раз не надо.

    Плюсы «запоминалок»:
    • В случае компрометации мастер-пароля для получения доступа к аккаунтам взломщику ещё надо добыть и зашифрованный файл. В случае генератора паролей ему останется только выяснить данные аккаунтов, на которых используются сгенерированные пароли. Правда, ИМХО, если злоумышленник смог получить мастер-пароль, то получить зашифрованную базу паролей ему тоже, скорее всего, будет несложно.
    • Можно использовать уже существующие пароли.
    • Позволяют запоминать пароль любой структуры из любого набора символов, нет проблемы с ограничениями на пароль на конкретных сайтах.

    Что дальше

    Ещё хочу дописать сюда базу аккаунтов. Так чтобы нужно было ввести только мастер-пароль и, опционально, пароль для расшифрования базы; а название сайта, логин, номер версии, длину пароля и список пропускаемых символов можно было бы взять из базы.

    Аналогичные программы

    В комментариях подсказали что есть ещё:
    MasterPassword — поделка хабравчанина FanKiLL
    pwdhash.com — то же на JavaScript от коллектива из Стэнфордского университета. Есть плагины для браузеров. После хэширования пароль дополняется так, что бы проходить стандартный тест на сложность.

    Only registered users can participate in poll. Log in, please.

    Как вы решаете проблему запоминания паролей?

    • 37.0%Использую стойкие пароли, которые храню в запоминалке паролей138
    • 19.8%Для каждого аккаунта придумываю пароль по определённой мнемонической схеме74
    • 2.7%Для каждого аккаунта ставлю такой пароль, который в голову придёт10
    • 3.2%Использую хэш-функцию для генерации паролей (как в статье)12
    • 20.6%Использую один пароль для [почти] всех аккаунтов77
    • 44.5%Использую один пароль для малозначимых аккаунтов, для важных — другой способ166
    • 6.4%Храню пароли на бумажке24
    • 2.1%Другой вариант (напишу в комментарии)8
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 33

      0
      Хммм, www.vpass.info/3/vpass.html? Разве не то?
      Ну и статья на хабре habrahabr.ru/post/169445/
        0
        Да, то! Чего-то я эту статью просмотрел когда по хабру искал.
        Ещё ниже в комментариях есть про MasterPassword
        +4
        Больше всего бесят сайты, у которых стоит ограничение на максимальную длину пароля. Придумаешь небольшой стишок на английском в качестве пароля, а он слишком длинный.
        В частности стишки и какие-либо длинные названия хорошо запоминаются и трудно подбираются. Каждое слово начинать с большой буквы, а некоторые буквы заменять на похожие символы: i — 1 или !, O — 0, b — 8 или % или &, t — +, a — @ и так далее.
        Например Laser — L1ghtAmpl1ficat1on8ySt1mulatedEm1ss1onOfRad1ation! — 50 символов, которые вы никогда не забудите.
        Или для хабра — HabrahabrIsNotPearlHarbour! — 27 символов.
          +1
          (крик души)
          О да! Я недавно был просто взбешен нашим сбербанком! У них в сбербанк онлайн (да да, это клиент банк — основная фигня, где юзеры могут потратить свои денежки, попивая коктейль в другой стране), стоит максимальная длина пароля в 10 символов (минимум 6)!
          У меня есть некоторое разделение по паролям, так вот на пароли, связанные с моими финансами, стоит пароль в 15 символов. Обычное русское слово, которое содержит большие буквы, а также цифры и спец символы. Но нет, сбербанк сказал мне, что нечего тебе 15 символов использовать, используй максимум 10, а то у нас ложки место пропадает. Ну или 6. Ведь 6 символов это так безопасно.
          Я также пользуюсь клиент банком авангарда. Там можно устанавливать пароль от 8 до 30 символов. В итоге получается, если я захочу реализовать пароль, который будет только в моей голове и не будет зависеть от каких-то программ, то мне надо придумать пароль от 8 до 10 символов.
          Я написал в сбербанк о проблеме с паролем, подробно разъяснив ситуацию, в итоге получил
          В настоящее время система «Сбербанк ОнЛ@йн» реализована именно таким
          образом и возможность ввода пароля, состоящего более чем из 10 символов, не предусмотрена.
          Благодарим Вас за проявленный интерес к услугам Сбербанка России. Все предложения учитываются и принимаются во внимание. Надеемся на дальнейшее сотрудничество.

          Спасибо за КЭПизм, уважаемый сбербанк. Уйду ка я лучше от вас, надоели окончательно.
            0
            Капец, мне интересно как родилось такое ограничение. Чтобы специально было легче подбирать или потомучто тестовый пароль был 0123456789.
              0
              у альфабанка та же проблема, хотя верхний лимит побольше. Но менее 17 символов… Я тоже не влез :(
              +2
              А ещё бесят сайты (точнее сайт, я всего один раз с таким идиотизмом встречался), которые запрещают вставлять пароль из буфера обмена.
                0
                А еще сайт onlime.ru при вставке из менеджера паролей хрома пароля длиннее чем их максимальное значение, не может залогиниться, так как введено неверное значение пароля.

                Я вообще подозреваю что можно сменить пароль просто GET или POST запросом и обойти это ограничение, но и забыть о ручном логине через форму на сайте
                  0
                  Встречаются сайты которые не «кричат» что пароль длиннее чем надо при регистрации и просто обрезают его при передаче на сервер, ну или там обрезается… Зато при логине — он неверен и угадать сколько символов надо «отрезать» от пароля затея не из простых, особенно если стоит ограничение на количество неудачных попыток.
              +3
              Я как то написал такое года 2-3 назад под андроид MasterPassword

              Когда под виндой — написал себе на c# + wpf программку

              image

              Под линуксом скрипт на python или ruby
                +2
                Забыл картинку в спойлер кинуть, простите, редактировать уже поздно.
                  0
                  Подскажите, а в вашей программе есть связь сайт-логин? В смысле, если я вобью «Domain», она мне покажет использовавшийся в связке логин? Или его придётся вспоминать отдельно?
                    0
                    Отдельно. Идея как раз была в том, чтобы не хранить вообще никаких состояний или данных. Я сейчас не помню и не знаю ни одного своего пароля. Если хранить привязку домена и логина — то это уже зачатки менеджера паролей(
                      0
                      Спасибо.

                      P.S. Хотя, вообще говоря, некие совсем уж зачатки уже есть — имеется отдельно база логинов, и отдельно база сайтов…
                        0
                        Если вы про мобильную версию, то там пользователи попросили чтобы было автодополнение доменов и сохранялись username — так как на мобильнике печатать не очень удобно и долго. Но домены и логины там никак не связаны между собой. В десктоп и скриптах что использую, ничего не сохраняется.

                        Вместо логина, если он у вас не постоянный можете использовать email их явно меньше чем псевдонимов)

                        Это в принципе частное решение, я писал для себя, потом оказалось что около 20к установок и на данный момент активных 500+ установок.

                        Интересная ситуация случается когда, устанавливаешь новую систему, а паролей ни одного не знаешь, даже в допбокс не зайти за скриптами или на битбакет. Приходится или с мобильника присылать пароль или садится и писать быстренько скрипт — благо алгоритм помнишь.
                          0
                          А где можно собственно алгоритм посмотреть?
                            0
                            Пока нигде, да и там всё примитивно, используется обычное хеширование. Хешируется каждый параметр, потом конкатенация в один длинный хеш, потом ещё хеширование. В целом хеширование используется около 3000 раз в том или ином виде на один пароль. (мне тогда это казалось оправданным, как раз была шумиха с радужными таблицами).
                            Если бы сейчас писал, я бы по извращался с перемешиванием букв в домене, логине и даже в самом мастерпасворде и потом опять таки хешировал бы всё вокруг)) Вообщем тут фантазия не ограничена. Главное не забыть алгоритм и как минимум проверить что выдаёт один и тот же результат. реализацию на нескольких языках.
                              0
                              А зачем извращаться с перемешиванием букв? Хэши это делают достаточно хорошо. Просто если перемешивания обратимы, то толку от них не много (на сколько я понимаю). А если необратимы, то может выйти так, что они будут вести к потере информации (энтропия выходного пароля будет уменьшаться). Создатели хэш-функций много работали что бы этих крайностей не было, надо пользоваться ;-)

                              А алгоритм интересно знать, т.к. если пользоваться андроид приложением, то хочется ту же программу иметь и на компе.
                +1
                Логин помнить все равно придется/где то записывать и хранить. Не всегда удается зарегистрироваться на сервисах со своим логином первым.
                  0
                  На многие сайты можно заходить по адресу е-мэила, а при генерации пароля поле логин можно заполнять, например, своим стандартным логином или просто оставлять пустым. Главное делать это однообразно для всех таких сайтов — чтобы не забыть.
                  0
                  Автору респект – именно на такую схему паролей перешёл полтора года назад (только беру другие порядковые номера, и ставлю их не только в конец).

                  Если бы кто меня спрашивал, какую схему выбрать, то посоветовал бы подобрать и выучить 12–значный пароль, например v8@Kq0rm!M (чтобы удобно было набирать двумя руками, чётные и нечётные символы берутся из разных половин клавиатуры), затем предпоследняя буква URL ресурса (только второй доменный уровень) вставляется третьей в верхнем регистре, а первая – в конец в нижнем регистре. Т.е. для id.tmtm.ru пароль будет v8T@Kq0rm!Mt

                  Ну и потренироваться надо первое время…
                    0
                    П.С. Минус такой схемы – это когда через какое–то время пароль надо (заставляют) менять, и оказывается, что приходится ломать схему (ибо для одного домена возможен только один пароль), и запоминать, что именно на это ресурсе используется другая схема, и что это за схема…
                      0
                      Ничто не мешает к уже криптостойкому паролю добавить в конце (или не в конце) целлочисленный номер. Он стойкости не помешает. А вот этот номер уже можно хранить даже в общедоступном месте — толку злоумышленникам от него — абсолютно никакого.
                    0
                    pwdhash.com
                    Серьезный плюс — есть плагины под различные браузеры.
                      0
                      Похоже что хорошая штука. Раньше не видел.
                      Причём после хэширования они ещё допиливают пароль так, чтобы он проходил проверку пароля на сложность.
                      0
                      Откройте для себя LastPass.

                      Пользуюсь уже много лет. Есть плагины под все браузеры, имеющие поддержку плагинов. Есть десктопные и мобильные приложения, в том числе в виде клавиатуры.

                      Есть бесплатная и платная версии. Платная стоит один доллар в месяц.
                        +4
                        Уж сколько раз твердили… KeePass Password Safe
                        • UFO just landed and posted this here
                            0
                            Плюсы такого алгоритма по сравнению с «запоминалками» паролей:

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

                            Прикрутил к KeePass плагин автосохранения — актуальная база всегда может быть скачана с дропбокса, например.
                            Отсутствует файл, который злоумышленник может украсть и попытаться расшифровать. Правда в хорошей запоминалке с хорошим мастер-паролем дешифрование базы паролей так же практически невероятно.

                            Да, так и есть, и? :)
                            Даже в случае получения полного доступа к вашему компьютеру (с чтением всех файлов и установкой кейлогеров) злоумышленнику ещё придётся отгадывать данные ваших аккаунтов

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

                            Перечитал три раза, представил себя злоумышленником и попытался угадать данные вашего аккаунта со своего компьютера — понял, что зада в лоб не решается :)
                            Гарантирует использование разных и случайных паролей. И придумывать пароль каждый раз не надо.

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

                                +1
                                Прикрутил к KeePass плагин автосохранения — актуальная база всегда может быть скачана с дропбокса, например.
                                Да, можно доверять дропбоксу. Просто вероятность того, что конкретный ваш файл по какой-то причине оттуда денется больше, чем вероятность того, что куда-то денется доступный всем код и хранящийся в разных местах код.
                                В случае получения такого доступа пароли это уже последнее о чем стоит беспокоиться — если у вас в доме нет одной стены, никому не нужны ключи от вашей двери.
                                Если у вас всё ценное лежит только на рабочем компьютере, то видимо да. В противном случае пароли и ключи от других аккаунтов (в широком смысле) — это первое, о чём стоит беспокоиться.
                                Перечитал три раза, представил себя злоумышленником и попытался угадать данные вашего аккаунта со своего компьютера — понял, что зада в лоб не решается :)
                                Честно, тоже перечитал несколько раз и не понял. Как связано то, с какого компьютера пытаться угадать данные аккаунта? Если в базе паролей хранить пароли от всего, то злоумышленник сразу может выбрать из них то, что ему интересно. Если базы нет — о некоторых ваших аккаунтах он просто не будет знать, и не получит к ним доступ (по крайней мере у вас будет запас времени на смену пароля)
                                P.S. Сорри, случайно отправил недописанный комментарий.
                                  0
                                  Да, можно доверять дропбоксу. Просто вероятность того, что конкретный ваш файл по какой-то причине оттуда денется больше, чем вероятность того, что куда-то денется доступный всем код и хранящийся в разных местах код.

                                  Обратите внимание сюда. Даже Keepass рекомендует при использовании дропбокса иметь локальную копию для синхронизации и именно она никуда не денется с вашего устройства, если дропбокс нашалит.
                                  Как правило хорошего тона стоит использовать хороший мастер пароль + ключевой файл к нему, который хранится только на устройствах с которых разрешен вход и этот файл не нужно синхронизировать где-либо, или просто выкладывать в интернет.
                                    0
                                    Да, можно доверять дропбоксу. Просто вероятность того, что конкретный ваш файл по какой-то причине оттуда денется больше, чем вероятность того, что куда-то денется доступный всем код и хранящийся в разных местах код.
                                    Но как вы сами ранее сказали:
                                    Правда в хорошей запоминалке с хорошим мастер-паролем дешифрование базы паролей так же практически невероятно.
                                    Поэтому, он у меня даже есть в публичном доступе на gdrive. Да что уж там, вот прикрепляю к этому сообщению — будет еще одно место где хранить.
                                    Если у вас всё ценное лежит только на рабочем компьютере, то видимо да. В противном случае пароли и ключи от других аккаунтов (в широком смысле) — это первое, о чём стоит беспокоиться.
                                    Все ценное и пароли, ИМХО, немного разные понятия, пароли это просто ключ к ценному. Причем этот ключ не должен быть единственным — сюда добавляется двухфакторная авторизация, ограничения по IP и т.п.
                                    Честно, тоже перечитал несколько раз и не понял. Как связано то, с какого компьютера пытаться угадать данные аккаунта? Если в базе паролей хранить пароли от всего, то злоумышленник сразу может выбрать из них то, что ему интересно. Если базы нет — о некоторых ваших аккаунтах он просто не будет знать, и не получит к ним доступ (по крайней мере у вас будет запас времени на смену пароля)
                                    Это относилось к
                                    злоумышленнику ещё придётся отгадывать данные ваших аккаунтов (особенно тех, в которые с этого компьютера не заходят)
                                    Здорово когда под отдельный аккаунт можно иметь отдельный компьютер :) Однако в большинстве случаев кейлоггера достаточно чтобы собрать все ваши учетные данные, пусть даже за достаточно длительный срок. При наличии трояна пароли уже не особо интересуют, т.к. злоумышленник получит доступ к интересующей информации после того как вы собственноручно пройдете все этапы аутентификации и авторизации в защищенной системе.

                                Only users with full accounts can post comments. Log in, please.