Прочитать первую часть трилогии можно здесь.

Как мы надежно храним надежные пароли.

Это был конец декабря 2021 года. Мы ехали через Техас и только что благополучно переночевали в El Paso. Низкий тебе поклон, Голливуд, за прекрасные фильмы, такие как "Sicario", после которых у нас тряслись коленки, когда мы въезжали в этот прекрасный город. Продолжаем движение по направлению к Boca Chica, чтобы посмотреть на Starbase (оно того стоит, поверьте). На улице жара +30 и солнечно, приятная летняя погода. В фоне отгоняю от себя мысли о том, что тут творится летом с температурой и людьми. О чем можно думать в этот момент, кроме как о космосе, о будущем и о распределенных системах? Шучу, много о чем можно думать, а не об этих гиковских заморочках :)

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

Минутка обучения: «Мастер‑пароль» — это особый пароль, это «папа‑пароль». Например:

  • Пароль ко всем паролям — если мы говорим о менеджере паролей.

  • Пароль от квартиры, где лежат деньги лежат (то есть, например, seed‑фраза, если мы говорим о криптокошельках).

Далее мы будем в основном думать над проблемой мастер‑пароля, потому что он особенный. Обычные пароли, которые лежат внутри менеджера паролей, нас не интересуют: с ними всё ясно и, по большому счету, нет никаких проблем.

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

Хотелось бы например сохранить мастер‑пароль в менеджере паролей, но чтобы получить доступ внутрь менеджера паролей нам нужен мастер пароль, классическая ситуация называемая сatch-22 — a difficult situation from which there is no escape because it involves mutually conflicting or dependent conditions.

И тут, конечно, вы можете сказать: «Подожди‑ка, всё уже давно изобретено, мастер‑пароль не нужен, ты просто не умеешь гуглить». А я отвечу: «Не торопитесь, мы только начинаем».

Диструшка comes to the rescue.

Я начал думать над вариантами, как можно было бы сохранить мастер‑пароль надежно. Все варианты всегда сводились к единой точке — мастер‑паролю, и эта точка всегда была point of failure, потому что, собственно, это одна точка в единственном экземпляре.

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

Какое фундаментальное улучшение мы получили в этом случае? Мы получили отказоустойчивость к частичным потерям или сбоям единичных узлов — утрата одной бумажки с мастер паролем не является проблемой, если у нас есть 10 штук в разных местах! А это значит, что мы уже вступаем на территорию распределенных систем, где всё ясно и понятно: CAP‑теорема и все, что мы так любим. Нам только остается красиво и безопасно реплицировать мастер‑пароль между разными устройствами пользователя, и дело в шляпе.

Оффтоп: кто заметили тонкий момент — тому печеньку. Когда мы, люди не можем что‑то запомнить, мы делегируем это внешнему носителю. То есть, знание пароля — это факт «знания секрета», а владение бумажкой с паролем — это «факт владения» секретом! Мы постоянно пользуемся этим трюком даже не замечая этого.

Комната в которой много дверей

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

One ring to rule them all

В нашем случае ровно наоброт: All devices to rule one master password.

Давайте уже переходим к самому интересному. Итак, предположим, мы скопировали мастер‑пароль на все устройства. Какая самая главная проблема здесь возникает? Если одно из устройств будет украдено или потеряно, злоумышленник может получить полный доступ к мастер‑паролю жертвы и, соответственно, ко всем ее паролям, поскольку база данных с паролями хранится на устройстве или в облаке.

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

Но как организовать такую схему? Ведь в нашей схеме нет никаких сотовых операторов или Google Authenticator, которые могут нам обеспечить двухфакторную аутентификацию. А что, если разделить мастер‑пароль на несколько частей и хранить каждую часть на каждом устройстве отдельно? Так сказать лайф‑хак от Волан Дэ Морта (он разделил душу на 7 частей и распихал по разным артифактам). Тогда чтобы на каком‑то устройстве получить мастер пароль, нужно запросить оставшиеся части с других устройств (помните о «факте владения»?). Если получится это сделать, то мы решим проблему. Я думаю вы уже догадались к чему я веду, что является секретным соусом и главным элементом в моем рассказе. Встречайте героя дня: Shamir Secret Sharing Scheme. Эта схема позволит нам разделить пароль с помощью математической магии, части которого мы и сохраним на всех устройствах. Имея одну часть нельзя ничего узнать о самом пароле, получить даже частичную информацию о нем. Это свойство называется perfect secrecy. В нашей схеме одно устройство запрашивает недостающие части с других устройств, и когда эти устройства разрешают операцию и пересылают свои части мастер пароля, устройство может восстановить мастер пароль и открыть им зашифрованную базу данных.

Кстати, поиграться cо схемой Шамира (и да, буква S в алгоритме RSA это тоже Шамир) можно здесь  — кнопочки Split и Recover. Изначально я написал эту веб страничку разделения секрета, чтобы посмотреть насколько удобно будет пользоваться простейшей версией с ручным хранением частей пароля в виде QR кодов.

В linux также есть консольная утилита.

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

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


  1. MAXH0
    00.00.0000 00:00
    +2

    Мне кажется самое неверное здесь -- мастер-пароль. Единая точка отказа. Это не только "One Ring to rule them all." Это еще и "One for the Dark Lord ". Когда надежность хранения твоего мастер пароля и всех с ним связаных зависит от программы, которую ты не контролируешь.

    Избежать необходимости запоминать сложный пароль - это запоминать (записывать и хранить в разных местах) простые и генерировать на основании них сложные.


    1. bynull Автор
      00.00.0000 00:00

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

      И как вы и сказали во второй части вашего комментария, ровно это и делает схема разделения секрета Шамира. Мой недочёт в том что я не объяснил больше деталей в статье, как она работает думая что все понимают этот момент, хотя большинство скорее всего видят её впервые


      1. MAXH0
        00.00.0000 00:00

        Я говорю, если есть внешняя программа которую ты не контролируешь - это уже зло. Надо чтобы генерация проходила в мозгу + доступные в любом месте свои скрипты. А можно еще и публично доступный текст воспринимать как огромный шифроблокнот.
        100500 разных решений миллиона пользователей лучше чем одна программа, которую можно взломать.
        Другой вопрос эти 100500 решений по хорошему тоже нужно проверить на уязвимость. Поэтому тему генерации паролей стоит обсуждать... А вот давать некую панацею идея так себе.


        1. bynull Автор
          00.00.0000 00:00
          +1

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

          Примеры:
          - скачиваете любой sha256 генератор на телефон, берете ваш пароль: 321, вгоняете его в программу и он вам выдает супер мега надежный пароль: 8d23cf6c86e834a7aa6eded54c26ce2bb2e74903538c61bdd5d2197997ab2f72
          - или более интересные варианты:
          * открываете мой сайт, или альтернативный
          * отключаете интернет
          * вводите пароль, программа генерирует QR коды, сохраняете их или распечатываете
          * закрываете страничку, подключаете интернет
          в такой схеме невозможно у вас ничего украсть, и не надо мозг использовать в качестве калькулятора.

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


  1. odilovoybek
    00.00.0000 00:00
    +1

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

    Безопасность обратно пропорционально удобству.


    1. bynull Автор
      00.00.0000 00:00
      +1

      Да, восстановление это самый критичный параметр наравне с защитой от взлома. Поэтому мы и хотим улучшить сразу несколько параметров: резервное копированиес мастер-пароля с репликацией, аналог двухфакторной аутентификации для восстановления мастер пароля, хранение паролей только на устройствах пользователей(как у оффлайн менеджеров паролей), end to end encryption услиливающий безопасность тем что расшифровать сообщение посланное одним устройством другому может только устройство получатель, ну и классическое симметричное шифрование chacha20 poly 1305.

      Но об этом будет в следующей статье


  1. aleksejs1
    00.00.0000 00:00
    +1

    Если вместо мастер-пароля часто используется биометрия, то риск забыть мастер-пароль увеличивается.

    А теперь представим ситуацию: человек находится в путешествии. При нём только 1 девайс - телефон. При попытке сфотографировать город, телефон случайно падает на землю и перестаёт работать. Билет на самолёт был в электронном виде. Его можно распечатать в отеле, но надо войти в аккаунт. Из-за стрессовости именно в этот момент мастер пароль вылетает из головы.

    Даже при наличии второго девайса, в экстренной ситуации доступ не восстановить.


    1. Kirillchug
      00.00.0000 00:00

      Так для таких событий существует в подовляющем виде ф-ия "Восстановления пароля", особенно если аккаунт к номеру телефона как второй фактор привязан, то проблем нет и делается считанные минуты


      1. mm3
        00.00.0000 00:00
        +1

        Применение второго фактора авторизации в качестве единственного необходимого для «Восстановления пароля» превращает этот дополнительный фактор в единственный достаточный для авторизации.
        Потеря контроля над этим вторым фактором (номером телефона) даже на короткое время (банальное оглашение четырёх цифр из смс незнакомым) равнозначно потере контроля над всеми аккаунтами привязанными к этому второму фактору и использующими только его для «Восстановления пароля».


        1. Kirillchug
          00.00.0000 00:00

          Так я и не говорил, что единственная. Могут дать выбор: e-mail или телефон.
          По поводу "потеря контроля над этим вторым фактором", ну поэтому существуют договрённость де-факто об умалчивании некоторых моментов безопасности. На это и на целены социальная инженерия. Многие момент просто приходят рано или поздно к тому, что ну это вот так дожно работать, дальше уже некуда, иначе уже не user-friendly и геморрно для пользователя, и тут уже вся надежда на тебя и твоё молчание. Это что про всякий кода по смс, токены авторизации, сессионные куки и многое другое.


          1. mm3
            00.00.0000 00:00
            +1

            Вы предложили использовать номер телефона, уже привязанный как второй фактор, в процедуре «Восстановления пароля» в качестве достаточного фактора для решения всех проблем и дополнительно ещё расширяете это выбором или e-mail или телефон, но никак не вместе. Получение контроля над любым таким достаточным фактором множит на ноль существование первого фактора (пароля) и любых других необязательных факторов. Добавление любой публично доступной, в том числе в результате утечек, информации в процедуру восстановления не сильно усложняет направленный перехват управления.
            Потерять контроль над номером телефона можно очень разными способами: телефон попал в руки постороннего человека добровольно (попросили позвонить, лежал на столе без внимания и т.д.) или принудительно (украден в метро, ограблен в подворотне, изъят для досмотра), смс перехвачен на этапе доставки как в сети оператора так (уязвимости протоколов) и до попадания в сеть оператора (взлом смс-шлюза, как было с сигналом), симка перевыпущена по доверености или номер возвращён оператором в пул номеров после неуплаты. Именно по этому и нужны несколько независимых факторов.
            Безопасность и удобство никогда не были на одной стороне и всегда искался некоторый компромисс или осознанная готовность пойти на определённые неудобства ради повышения безопасности.


            1. bynull Автор
              00.00.0000 00:00

              Именно! Нельзя жертвовать своими паролями ради удобства восстановления. Мир постепенно движется к self custody, только твои данные только твоя ответственность. Когда у тебя есть только твой пароль никто его восстановить не сможет, нужно придумывать системы где у пользователя будет тоже удобство и надежность что и у облачного провайдера но все данные будут у пользователя и это интересная и сложная задача


              1. aleksejs1
                00.00.0000 00:00
                +1

                У google один из методов двухфакторки - это карточка с одноразовыми кодами. Эта карточка печатается, и может быть вложена в бумажник, который при себе почти так же часто, как и телефон. Если добавить к этой схеме ещё и добавить разделение мастер пароля по Шамиру, но в аналоговом виде - на бумажках, то ситуация в путешествием и утратой телефона становится лучше. А если ещё части пароля на бумажках задекорировать в виде списка достопримечательностей, буклета гостиницы, или шпаргалки-разговорника, то помимо того, что злоумышленику придётся получить доступ ко всем вашим вещам, ему ещё потребуется масса времени, что бы понять где важная информация, а где - нет.


      1. ssj100
        00.00.0000 00:00
        +1

        У Вас подозрительная активность и попытка входа из Бангладеш поэтому мы заблокируем ваш аккаунт, сейчас на (ваш разбитый и без роуминга)телефон придет СМС и вы сможете разблокировать через 24 часа


        1. Kirillchug
          00.00.0000 00:00

          ну телефон может сломаться, а симку можно переставить. Сейчас очень многое на номере телефоне завязано, потому что это в 98% доступно и наименее подвержено к критичным ситуациям. Да, те кто на совсем уезжает из своей страны в другую - те столкнуться с этой проблемой.
          UPD: Мегафон для таких целей можно использовать VoIP, что уже убирает разделение на роуминг и не роуминг


          1. pvsur
            00.00.0000 00:00
            +1

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


            1. Kirillchug
              00.00.0000 00:00

              Тогда я не понимаю тенденцию даже того же FAANG в восстановлении аккаунта по телефону


              1. pvsur
                00.00.0000 00:00

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


            1. Kirillchug
              00.00.0000 00:00

              Кстати, а с другой стороны. А почему нас как разработчиков да и даже сам бизнес должно волновать, как рапоряжился с тем же самым телеофном пользователь?Ну, как был пример, с потерей телефона. Ну так это проблемы пользователя. Мы же не может абсолютно все действия его предусмотреть. Наша задача, чтобы данные его не вскрылись, когда кто-то к нам вломится с непринадлежещего пользователю устройства. А то что кто-то, к примеру, потреля телефон и не заблочил симку, ну извините ... "Ваня - он и в Африке Ваня".
              Или пользователь выложил данные в открытый доступ. Система разве отвественная за то пользователь свои данные выложил? Никакая система это не предусмотрит. Это тогда излишняя нагрузка на систему, которая не опрадана ничем.
              Просто система идёт с пользователм на компромисы. Что вот данные, если их разглашить или передавать 3-м лицам не будете, то мы гарантируем вам безопасность. А то что вы распорядились ими безотвественно, то уже мы ничем не поможем. Система же не подталкивала пользователя к таким действиям


              1. bynull Автор
                00.00.0000 00:00

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

                В остальном всё так, конечно же


  1. ayayaya
    00.00.0000 00:00

    логин-пароль это упрощенный доступ к виртуальным данным он не должен быть основным


  1. Revertis
    00.00.0000 00:00
    +1

    Есть ли у человека ресурсы мозга для запоминания какой-то фразы или строчки из песни?

    Есть ли у человека ресурсы мозга на запоминание небольшого (10-12 символов), и не очень сложного пароля?

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

    Короче, всё это есть в расширении, о котором я писал в комменте к прошлой статье.


    1. bynull Автор
      00.00.0000 00:00

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


      1. Revertis
        00.00.0000 00:00

        Да, к сид-фразам это не применить. Их надо хранить где-то.

        А вот пароли от сайтов без проблем генерятся заново.


      1. pvsur
        00.00.0000 00:00

        100 000 раз - это дешёвый маркетинг, хватит и пары раз, хэширование ведь... Обходите стороной, все что мажут медом для привлечения...


        1. bynull Автор
          00.00.0000 00:00

          100 тысяч раз нужны чтобы замедлить перебор. Брутфорс пары раз очевидно будет в 50 тысяч раз быстрее чем брутфорс 100 тысяч итераций.