50 оттенков паранойи или как хранить пароли не сохраняя

    Привет, %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

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

    А на какой стадии паранойи Вы?

    • 6.6%Нулевая34
    • 5.5%Первая28
    • 9.6%Вторая49
    • 12.1%Третья62
    • 66.3%Не скажу, вы так вычислите мои пароли340
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 40

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

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

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

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

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

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

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

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

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

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

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

              Вам нужен password derivation(https://en.wikipedia.org/wiki/PBKDF2) и один мастер-пароль. Но и это сомнительно с точки зрения безопасности.
        +7
        По-моему, это security through obscurity. Нужно исходить из того, что злоумышленнику известно о вас все — ваши алгоритмы для создания паролей, имя, фамилия, местоположение, сайты на которые вы ходите, день рождения вашей мамы и тп.
        У вас получается, что секретом для злоумышленника в таком случае остается только ваш короткий пин. Который еще выходит и одинаковый для разных сайтов?
        И да, последний уровень паранойи — считайте, что и ваше оборудование тоже находится под полным контролем злоумышленника. =)
          0
          Я повторюсь, что координаты — это значение, которое указывается вручную, например через гугл карты, размер пина — это двойка в степени уровня вашей паранойи и символы вы вольны использовать какие угодно, но поверьте, у вас даже с цифрами ничего не выйдет
            +2
            Насколько я понимаю, то вы используете координаты, которые возвращаются гуглом по определённому поисковому запросу. Не знаю, как гугл, но я сталкивался с изменениями координат для запроса (проще говоря, центра города) на какие-то там пару метров. Если я правильно понимаю, то в таком случае резко херятся все пароли ко всем ресурсам. То же самое для смен урлов или даже http на https, но локально — придётся менять пароль на самом ресурсе.

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

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

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

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

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

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

              Я как раз использую похожий метод хренения паролей, вместо пина — мастер пароль (сам по себе хороший и рандомный — это единственное что надо запомнить). Только в результирующем пароле использую шестнадцатеричные цифры — при достаточном количестве символов секурность не уменьшается, а набирать пароль на разного рода мобилках становится в разы проще.
              +4
                –6
                Автор, да ты гений! Это ведь теперь вместо пароля можно запоминать не последовательность символов, а любое место на земле. Подобрать в этом генераторе уникальную настройку и брутфорс таких параметров становится совсем нерациональным. А если ещё и пинкод менять относительно времени с какой-нибудь привязкой. То всё, про брутфорс забываем, будто его и не существует.
                Мне вот было лень задумываться о своей паранойи, но с таким методом я пожалуй подтяну свою информационную безопасность.
                  +6
                  Как будут обрабатываться такие сценарии:

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

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

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

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

                        Пока не случалось (за 3 года), но думаю изменю алгоритм генерации
                        0
                        На этом сайте справа есть генератор паролей. Суть: придумываем ключ и вводим его (один для всех ресурсов) и URL. Пароли для каждого URL генерятся разные. Но для пары ключ-URL пароли одинаковые. Можно пользовать для запоминания паролей на всяких форумах и прочих не содержащих финансовую информацию сайтах.
                          +4
                          Пользователи KeePass уже давно перестали париться, и только все остальные всё продолжают что-то выдумывать...
                            –1
                            третья стадия
                              +2
                              Будто что-то плохое.
                              Один мастер-пароль и база. Где тут можно закопаться — непонятно. Хотите — используете ключи. Не хотите — не используете. Это уже для тех, за кем могут прийти.
                              0
                              Или, как вариант, keepassx, только вопросы синхронизации базы между устройствами и удобной интеграции с браузерами для автозаполнения остаются открытыми.
                                0
                                Извиняюсь за ссылки на себя, но вот предложение для интеграции со всем, чем угодно: https://habrahabr.ru/post/276967/
                                А вот синхронизация напрямую влияет на безопасность уже, к сожалению.
                                  0
                                  Круто! Я сейчас пытаюсь совместить мою идею с Teensey 3.2, которая через USB работает как клавиатура и мышь, что по сути напоминает Ваш проект
                              –2
                              > Где функция sha512 — генерирует хэши алгоритмом sha512, а функция Base85 — преобразует шестнадцатеричную систему счисления в восьмидесятиричную

                              Надо не «из шестнадцатеричной», а бинарный сырой хеш брать и переводить. А то бредом попахивает.
                                0
                                Минусовавшим: если я не ошибасью, функция возвращает строку литералов от a до f, какой смысл энтропию увеличивать и воздух греть лишний раз, и просто раздувать строку, при этом перевод бинарного хеша в Base85 имеет смысл и удобство.
                                +1
                                Что если мне надо сменить пароль? Не через месяц и не через год, а уже, потому что он утёк. В любой паролехранилке я это сделаю, а тут — нет. Что если сайт придумал какие-то свои требования для сочетания символов в пароле? 2 больших буквы, 2 маленьких, 2 кириллических и т.п.? Паролехранилка справится, штука из статьи — нет. Что если в штуке сменилась соль по времени, а на нужном сайте как раз сломался сброс паролей? На него будет не зайти, пока не починят, а мне надо экстренно, срочно.
                                Вывод — придумана глупость. Поставьте кипасс на криптодиск, в экселе наколдуйте парольную карточку 10х20 на миллион комбинаций, туда впишите мастер-пароли диагональю или змейкой и не морочьте себе голову.
                                  –1
                                  я не предлагаю конкретный подход, это всего лишь идея, ваша аггрегирующая функция может быть какой вам угодно и генерировать по вашему желанию то, что вы захотите, хоть 10 запятых подряд

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

                                  Вывод — Вы не поняли ничего
                                    +1
                                    Вы странный. У меня никакого «желания» нет, это у разных сайтов разные требования к паролям. Которые принципиально противоречат друг другу, так что универсальной функции для генерации пароля для любых сайтов быть не может. При всём желании. О чём я и написал. На одном сайте максимальная длина пароля 8 символов, на другом минимум 12, на одном требуют кириллицу, на другом это запрещено.
                                • UFO just landed and posted this here
                                    0
                                    но ведь хэш в hex это строка состоящия из символов [0-9a-f], тут даже речи не идет про регистр и знаки пунктуации
                                    • UFO just landed and posted this here

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