Привет, %username%

Одиночество и паранойя могут быть прекрасным творческим материалом.
Энн Ламотт

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

Для начала взглянем на ситуацию в общем. Есть ресурс, который можно идентифицировать. Например, веб-ресурс идентифицирется по схеме, хосту и порту, например https://login.awesome.site.com/, в свою очередь десктопное приложение может быть идентифицировано по имени исполняемого файла, например awesom-app.exe или по заголовку окна или его части. Итак с идентификатором разобрались. Далее идут логин и пароль. Логином может служить как имя пользователся, так и адрес его электронной почты, что бы идентифицировать пользователя. А теперь давайте взглянем на пароль, но с другой стороны. Пароль — это своего рода соль (salt) нулевого уровня для генерации хеша. Например:

hash(username + ':' + password + ':' + salt)

Отсюда можно выдвинуть идею о количестве солей в хеш-функции: чем больше — тем лучше. Можно взять размер конечного пароля, время (час, день, месяц или даже год) и до кучи географические широту и долготу какой-либо точки на земле. Следовательно, требования к сложности входящего пароля падают и вместо него можно использовать более простую последовательность символов, например из четырех цифр (не рекомендуется с уровнем паранойи 2 и выше).
А теперь, давайте взлянем, что можно с этим всем сделать. Для экспериментов я выбрал Google Chrome и написал для него простое расширение. По клику на иконке появляется окно генерации паролей, расширение получает адрес активной вкладки.

chrome.tabs.query({active: true, currentWindow: true}, tabs => generate(tabs[0].url) );

Затем создаем JavaScript объект URL и массив параметров для генерации хэша. Берём именно url.origin, что бы иметь схему, хост и порт:

const username = 'username';
const pin= '1234';
const size = 16;
const expired = 2016;
const latitude = 40.771426;
const longitude = -73.9771395;

function generate(url) {
    const url = new URL(url);
    const params = [ url.origin, username, pin, size, expired, latitude, longitude ];
    const hash = sha512(params.join(':'));
    const password = Base85(hash).slice(-size);
    document.getElementById('password').value = password;
}

Где функция sha512 — генерирует хэши алгоритмом sha512, а функция Base85 — преобразует шестнадцатеричную систему счисления в восьмидесятиричную формата [A-Za-z0-9]+ и 25 пунктуационных символов обязательно включая пунктуационные символы, таким образом, что отображение функции generate является сюръективным, а пароль получается персистентным (постоянным для одинаковых аргументов функции) и тяжело воспроизводимым.
На данный момент расширение выглядит вот так:
image
А сами пароли от сайтов нигде не хранятся и моя паранойа пока спит спокойно.

P.S. Если есть идеи как можно усовершенствовать эту идею, буду рад увидеть в коментариях.
P.P.S. Опечатки и ошибки пожалуйста в ЛС.
P.P.P.S. Дабы упредить вопросы о сложности расшифровки, предположим что мой ник и pin 1234 использовались для генерации пароля, хотя давайте предположим, что пин вы не знаете. Тогда какой у меня пароль?
P.P.P.P.S. Только заметил, что в таком случае, фишинговые сайты в пролете на мой пароль

UPD:
Схема генерации:
image
А на какой стадии паранойи Вы?

Проголосовало 493 человека. Воздержалось 167 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (40)


  1. dmitry502
    21.02.2016 07:07
    +4

    Возможно у меня совсем уже ночь, но я верно понял, что единственная вещь, которая действительно неизвестна злоумышленнику — четырехзначный пин?
    Идея необычная и интересная, но лично я вижу тут концептуальную проблему: вы считаете, что информация о пароле не хранится нигде, но на самом деле, информация о пароле хранится везде, но не вся(пин у вас в голове).
    Я не очень понял про координаты. Это ваши координаты или сервера? В первом случае, они будут меняться, как и пароль. Во втором — они доступны всем в интернетах.

    А теперь досадная часть: вы когда-нибудь перебирали пароли? Не брутфорся сайт, а имея базу хэшэй. Я писал простенькую софтину, которая перебирала пароли для одной базы(не злого умысла ради, а чсв для), где люди таки научились к 2013-му году делать hash(hash(pass)+user_id). Хоть это и заставило меня брутить месяц(мне лень было использовать gpu), но я получил более 80% паролей.
    Скорее всего, Hashcat или кто-нибудь еще так умеют(мне сильно мешал id юзера и мне приходилось перебирать сильно больше, чем если бы была обычная соль), да еще и на gpu, но не суть.
    Идея в том, что брутфорсить можно долго и упорно. В вашем случае это не так сложно. Я бы впал в депрессию, если бы узнал, что есть целая база подобных паролей. Ну и писал бы свой брутфорсер.
    Но, опять же, возможно я неверно понял концепцию, тогда извиняюсь


    1. 3axap4eHko
      21.02.2016 07:54

      Возможно у меня совсем уже ночь, но я верно понял, что единственная вещь, которая действительно неизвестна злоумышленнику — четырехзначный пин?

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

      Я не очень понял про координаты

      Координаты вы можете выбрать сами, какие вам нравятся. Например лбимое вам место.

      где люди таки научились к 2013-му году делать hash(hash(pass)+user_id)

      Смотрите, в данном случае, pass на сайте это наш сгенерированный пароль, который так-же является результатом некой хэш-функции.

      Но, опять же, возможно я неверно понял концепцию, тогда извиняюсь

      Концепция — перестать хранить пароли


      1. dmitry502
        21.02.2016 09:16
        +4

        Ну, тогда я все верно понял. Единственная действительно неизвестная вещь это пин и, раз уж вы настаиваете, то формат.
        Проблема в том, что большинство людей очень похожи. И будут придумывать одинаковые комбинации.
        Перебрать это все не такая уж и проблема. Зависит от того как люди будут придумывать это все. Будет ли у них код, в котором они это велосипедят? Или будет менюшка гуевая с настройкой всего.
        Но в любом случае 80% оставят дефолтные настройки.
        Но человек снизу верно сказал, что это security through obscurity. К тому же, тогда частью хранения пароля является их формирование(ваш скриптец, который будет свой у каждого юзера)
        Упрем скрипт(который юзер будет непонятно_как синхронизировать между тоннами девайсов) — получим доступ к его аккаунтам. Учтем еще, что юзеры, поверевшие в безопасность всей системы, будут использовать пин(или все другие заменяющие пароль вещи) как пин, а не как пароль и будут делать его слабым, надеясь на остальную магию. А потом будут удивляться как за 7 секунд сбрутили акк.
        В итоге, вы придете к тому, что вместо пина должен быть полноценный пароль, а все остальное не гарантирует безопасность.
        Вы не ушли от хранения паролей. Вы ушли от хранения паролей старыми способами. По факту, хватило бы и мастер-пароля(он будет един и у вас, тут вы его назвали ПИН) + PBKDF2 для генерации сотен паролей для других сервисов


        1. 3axap4eHko
          21.02.2016 18:06

          Ну, тогда я все верно понял.

          Почему только пин, прочитайте параметры [ url.origin, username, pin, size, expired, latitude, longitude ];
          Так же можно добавить гироскоп, акселератор и кучу других параметров


          1. dmitry502
            21.02.2016 19:34
            +1

            Это все информация, которая от чего-то зависит. Она не рандомная. Ее можно узнать и ЗНАЧИТЕЛЬНО упростить брутфорс.
            url.origin — адрес сайта
            username — юзер
            expired — год/дата(сьрутить дату очень просто)
            latitude/longtitude — какие-то места. И их не много. У людей будет список мест, которые они будут выбирать. Не у каждого будет лично свое место.
            Вся эта информация не абсолютно рандомна. Ее можно сбрутить, потому что она от чего-то зависит. Например, часть людей будет юзать кремль. Достаточно поиметь 10к локаций и мы будем чаще всего угадывать.

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

            Вам нужен password derivation(https://en.wikipedia.org/wiki/PBKDF2) и один мастер-пароль. Но и это сомнительно с точки зрения безопасности.


  1. mapron
    21.02.2016 07:49
    +7

    По-моему, это security through obscurity. Нужно исходить из того, что злоумышленнику известно о вас все — ваши алгоритмы для создания паролей, имя, фамилия, местоположение, сайты на которые вы ходите, день рождения вашей мамы и тп.
    У вас получается, что секретом для злоумышленника в таком случае остается только ваш короткий пин. Который еще выходит и одинаковый для разных сайтов?
    И да, последний уровень паранойи — считайте, что и ваше оборудование тоже находится под полным контролем злоумышленника. =)


    1. 3axap4eHko
      21.02.2016 08:03

      Я повторюсь, что координаты — это значение, которое указывается вручную, например через гугл карты, размер пина — это двойка в степени уровня вашей паранойи и символы вы вольны использовать какие угодно, но поверьте, у вас даже с цифрами ничего не выйдет


      1. extempl
        21.02.2016 10:11
        +2

        Насколько я понимаю, то вы используете координаты, которые возвращаются гуглом по определённому поисковому запросу. Не знаю, как гугл, но я сталкивался с изменениями координат для запроса (проще говоря, центра города) на какие-то там пару метров. Если я правильно понимаю, то в таком случае резко херятся все пароли ко всем ресурсам. То же самое для смен урлов или даже http на https, но локально — придётся менять пароль на самом ресурсе.

        В целом, идея интересна с точки зрения самого интереса. Насколько это целесообразно — уже много раз писалось.


        1. redmanmale
          21.02.2016 14:36

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

          Как я понял, это не так. "Координаты" задаются пользователем ручками, по смыслу это аналог пина, просто задаётся не сразу цифрами, а через гуй на карте.


          1. 3axap4eHko
            21.02.2016 18:01

            Совершенно верно, хоть кто-то понял


            1. extempl
              21.02.2016 23:05

              Ну хорошо, допустим логика такая: вводим название города, получаем координаты -> вписываем вручную в нужное поле.
              Открываем другой комп (новый, взамен украденного/потерянного/переустановка системы/etc) — вводим название города (координаты-то не помним), используем найденные — а они оп, и изменились. Вот о чём речь, нестабильно это как-то, тем более если речь идёт о генерации паролей.


              1. 3axap4eHko
                21.02.2016 23:07

                все происходит визуально, вы перетаскиваете маркер на карте в нужную точку. Все абсолютно интерактивно.

                Посмотрите это
                1. Frankenstine
                  23.02.2016 11:52

                  Генерация пароля по рандомным датам, получаемым тыканьем в произвольную точку, не подходит для повторного ввода этого же пароля — невозможно ткнуть мышкой в точно ту же координату. Следовательно, придётся 1) порезать карту на достаточно крупные клетки (ограничить разрядность координаты) чтобы нивелировать точность позиционирования (юзер не захочет ломать голову попал ли он в нужный квадрат получив сообщение "введеённые вами данные не подходят"), и 2) пользователю таки придётся помнить куда он ткнул — для каждого ресурса человек неспособен помнить координаты для каждого из них, следовательно будет использовать 1, 2 максимум 3 места.
                  Я до сих пор не понимаю, как пара цифр будет надёжнее дополнительных пары символов из более широкого словаря в обычном пароле.


                  1. 3axap4eHko
                    23.02.2016 21:58

                    1, 2 максимум 3 места.

                    Если ввести адрес (город, улица, дом) то маркер попадет в то же место с теми же координатами. Конечно, я получаю их не с точностью до метра, но тем не менее, сколько вы помните различных адресов с точность до дома? Я уверен что десятки.


                    1. Bronx
                      23.02.2016 23:42

                      > маркер попадет в то же место с теми же координатами.

                      Вы можете гарантировать, что это будет так в течение хотя бы года, и что при очередном апдейте карт координаты дома не съедут? Вы же в курсе, что карты основываются и периодически обновляются на базе множества источников данных — аэрофотография, спутниковые снимки, вклад добровольцев на Google Map Maker, возможно импорт данных с Wikimapia, OpenStreetMap где тоже добровольцы вносят редакции?

                      Чтобы сделать проблему более выпуклой: какую сумму денег вы бы поставили на кон за то, что координаты не станут причиной массовой утери паролей?


                    1. Frankenstine
                      24.02.2016 14:35

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


    1. Restorer
      21.02.2016 09:36

      Мне кажется, что часть вопросов к статье отпадёт, если сказать что пин — это не обязательно 4х-значное число, а вполне себе может быть неким очень непростым мастер-паролем.

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



  1. ComradeAndrew
    21.02.2016 10:47
    -6

    Автор, да ты гений! Это ведь теперь вместо пароля можно запоминать не последовательность символов, а любое место на земле. Подобрать в этом генераторе уникальную настройку и брутфорс таких параметров становится совсем нерациональным. А если ещё и пинкод менять относительно времени с какой-нибудь привязкой. То всё, про брутфорс забываем, будто его и не существует.
    Мне вот было лень задумываться о своей паранойи, но с таким методом я пожалуй подтяну свою информационную безопасность.


  1. Bronx
    21.02.2016 10:55
    +6

    Как будут обрабатываться такие сценарии:

    * ресурс поменял адрес (пример: «odnoklassniki.ru» >> «ok.ru»)
    * один и тот же аккаунт используется на нескольких родственных ресурсах, но там нет единого федеративного логона
    * пользователь не стал записывать longitude/latitude на бумажке, надеясь на гуглмап, а однажды ночью наши учёные чуть-чуть изменили гравитационное поле Земли, после чего гуглмап внёс небольшие поправки в свои карты, и теперь потаённое место пользователя имеет слегка другие координаты (ну тут просто: надо ограничить точность координат).
    * пользователь плагина замучался каждый раз искать на карте село Гадюкино, в котором он когда-то жил, творил и создавал пароли, и решил использовать координаты Кремля. Нужно перегенерить пароли, но страница смены пароля имеет другой адрес, нежели страница входа — например, у гугла вход на accounts.google.com, а смена пароля — на myaccount.google.com.


    1. 3axap4eHko
      21.02.2016 18:04

      вам никто не запрещает изменить пароль, или брать его со своего домена, например https://google.bronx.me, а вставлять куда захотите


    1. Vladislav_Dudnikov
      23.02.2016 13:32

      Получается основные вопросы к плагину, а не к концепту?


      1. Bronx
        24.02.2016 00:05

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

        Плюс не учитывается садистская изощрённость админов, придумывающих всё новые и новые дурацкие политики для паролей. Пароли, сгенерённые без учёта местной политики сайта, будут часто упираться в ошибку валидации («недопустимый символ», «недопустимая длина», «недопустимая комбинация» и т.п), а способа подсказать плагину правильный алгоритм на лету — нету. Если плагин покрывает 80% случаев, но оставшиеся 20% придётся делать вручную и помнить самостоятельно, то лучше всё сразу делать вручную, чем запоминать, где пароль автоматический, а где нет.


  1. lexore
    21.02.2016 14:20

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


    1. 3axap4eHko
      21.02.2016 18:18
      -1

      А как вы меняете пароли?

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

      И что будете делать, если злоумышленник узнает ваш способ генерации паролей?

      Пока не случалось (за 3 года), но думаю изменю алгоритм генерации


  1. alekseev_ap
    21.02.2016 15:05

    На этом сайте справа есть генератор паролей. Суть: придумываем ключ и вводим его (один для всех ресурсов) и URL. Пароли для каждого URL генерятся разные. Но для пары ключ-URL пароли одинаковые. Можно пользовать для запоминания паролей на всяких форумах и прочих не содержащих финансовую информацию сайтах.


  1. Beholder
    21.02.2016 18:52
    +4

    Пользователи KeePass уже давно перестали париться, и только все остальные всё продолжают что-то выдумывать...


    1. 3axap4eHko
      21.02.2016 18:53
      -1

      третья стадия


      1. dmitry502
        21.02.2016 19:38
        +2

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


    1. denis4inet
      21.02.2016 19:37

      Или, как вариант, keepassx, только вопросы синхронизации базы между устройствами и удобной интеграции с браузерами для автозаполнения остаются открытыми.


      1. dmitry502
        22.02.2016 05:09

        Извиняюсь за ссылки на себя, но вот предложение для интеграции со всем, чем угодно: https://habrahabr.ru/post/276967/
        А вот синхронизация напрямую влияет на безопасность уже, к сожалению.


        1. 3axap4eHko
          22.02.2016 05:18

          Круто! Я сейчас пытаюсь совместить мою идею с Teensey 3.2, которая через USB работает как клавиатура и мышь, что по сути напоминает Ваш проект


  1. igordata
    21.02.2016 21:06
    -2

    > Где функция sha512 — генерирует хэши алгоритмом sha512, а функция Base85 — преобразует шестнадцатеричную систему счисления в восьмидесятиричную

    Надо не «из шестнадцатеричной», а бинарный сырой хеш брать и переводить. А то бредом попахивает.


    1. igordata
      29.02.2016 19:33

      Минусовавшим: если я не ошибасью, функция возвращает строку литералов от a до f, какой смысл энтропию увеличивать и воздух греть лишний раз, и просто раздувать строку, при этом перевод бинарного хеша в Base85 имеет смысл и удобство.


  1. alexf2000
    22.02.2016 04:57
    +1

    Что если мне надо сменить пароль? Не через месяц и не через год, а уже, потому что он утёк. В любой паролехранилке я это сделаю, а тут — нет. Что если сайт придумал какие-то свои требования для сочетания символов в пароле? 2 больших буквы, 2 маленьких, 2 кириллических и т.п.? Паролехранилка справится, штука из статьи — нет. Что если в штуке сменилась соль по времени, а на нужном сайте как раз сломался сброс паролей? На него будет не зайти, пока не починят, а мне надо экстренно, срочно.
    Вывод — придумана глупость. Поставьте кипасс на криптодиск, в экселе наколдуйте парольную карточку 10х20 на миллион комбинаций, туда впишите мастер-пароли диагональю или змейкой и не морочьте себе голову.


    1. 3axap4eHko
      22.02.2016 05:06
      -1

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

      Вывод — придумана глупость.

      Вывод — Вы не поняли ничего


      1. alexf2000
        22.02.2016 05:27
        +1

        Вы странный. У меня никакого «желания» нет, это у разных сайтов разные требования к паролям. Которые принципиально противоречат друг другу, так что универсальной функции для генерации пароля для любых сайтов быть не может. При всём желании. О чём я и написал. На одном сайте максимальная длина пароля 8 символов, на другом минимум 12, на одном требуют кириллицу, на другом это запрещено.


  1. Ivan_83
    23.02.2016 21:50

    Лет 12 назад или больше я сделал намного проще:
    пароль на user@DOMAIN = HMAC(Secret, user@DOMAIN)
    user@DOMAIN приводится к одному регистру.
    Тогда не было у меня sha2-512, был md5 и sha1 :)
    Результат в hex пилю на блоки по 16 и использую.

    По хорошему надо бы переделать на более современную хэш функцию и BaseXX вместо HEX, а ещё лучше XOR для двух и более HMAC от разных хэш функций.
    Сам по себе хэш не даёт 100% гарантии того что зная часть открытых данных и результат не получится получить оставшуюся часть закрытых данных быстрее, чем перебором.
    Те слабость метода в том, что если упереть пароль с одного ресурса то есть вероятность восстановления всей необходимой информации для генерации паролей на других ресурсах.
    И потом, хэш функции сами по себе активно исследуют и находят слабости, лет 10 и менее они живут в состоянии когда считаются надёжными.
    HMAC ощутимо усиливает любой хэш алгоритм, например hmac_md5 до сих пор считается безопасным.
    А если сложить по ХОР результаты двух и более HMAC на разных хэш функциях то результат по надёжности будет как самый лучший HMAC+HASH.

    Чёто я разошёлся, дешевле будет нанять пару отморозков которые получать все пароли на бумажке, чем возится хотя бы с одним HMAC :)


    1. 3axap4eHko
      23.02.2016 22:00

      но ведь хэш в hex это строка состоящия из символов [0-9a-f], тут даже речи не идет про регистр и знаки пунктуации


      1. Ivan_83
        24.02.2016 23:19

        С одной стороны да, пароль с низкой энтропией.
        С другой стороны 16 HEX это 2^64 вариантов, те весьма не мало.
        Использование base64 даёт 2^96 при тех же 16 символах в пароле.

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

        Вполне очевидно что даже полный перебор 2^64 по сети будет идти довольно долго, а 2^96 не реально долго, опять же дешевле и быстрее заслать кого то физически чем тратить время на этот онанизм по сети.

        В следующей версии сделаю пачку разных HMAC с хор на выходе и б64, только пока необходимости нет.