Способ генерации и хранения паролей seedpass
Задача
Уже делал создание и восстановление паролей Pass на основе хешей из "солёной" мнемоники сайта. Пароли получаются очень высокоэнтропийные (до 256 бит), восстанавливаются через любой онлайн-калькулятор хешей и достаточно помнить только соль. Очень высокая восстановимость, но такие пароли не подходят для ручного ввода чаще чем "желательно никогда", невозможно запомнить даже один пароль.
Ограниченный словарь символов иногда приводит к непроходящим для сервиса паролям, если нужны спецсимволы или большие буквы. Допустим, с большой буквой решаемо - делать большой буквой первую попавшуюся или с каким-то фиксированным номером. Такой "особый" пароль сразу теряет свойство восстановимости. Не получится запомнить, где требовалась буква, где ограничена длина, где какой добавлен спецсимвол. Теряется главное преимущество.
Лёгкость восстановления обеспечивается одинаковой солью. Но если понадобится сменить один пароль, то придётся поменять для него соль или мнемонику сайта. Что делает пароль "особым" и он больше не восстановим без парольного менеджера.
Я пользуюсь такой системой давно и раз за разом набор паролей приходит к состоянию "часть не восстанавливается". Такие пароли не получится заново прохешировать в браузере, но и для перепечатки они непригодны: 64 символа с высокой вероятностью ошибиться в любом. Например, если нужно зайти в аккаунт на другом устройстве, или первый раз зайти на своём, ещё до установки всех программ - придётся очень постараться.
Решение
Как альтернативу, продумал метод на основе сдвигового среза по одному длинному "паролю". Производные пароли получаются длинные, сохраняют достаточно высокую энтропию, остаются уникальными для сайтов и теперь их реально запомнить. Схоже с "Correct Horse Battery Staple", но по общедоступному словарю и одному источнику энтропии.
Основа метода: сдвиговый срез по одному длинному "паролю". Назначение: удобные для ввода и запоминаемые пароли с высокой энтропией. Энтропия намного ниже, чем в варианте с хешами, но более чем достаточна для веба, особенно сервисов с 2FA.
Рассмотрим простейшую схему: сдвиг на одну позицию для каждого нового сайта, в конце пароля добавляется индекс сайта, разделение дефисами. Сид возьмём короткий, всего из шести слов для наглядности. Срез будет по четыре слова. Для соответствия требованиям "должны быть буквы разного регистра", заранее выберем какая буква будет большая: первая в первом слове.
Сгенерируем сид "как для криптокошелька" по методу bip-39 в любом инструменте по запросу "bip39 seed generator" (не делайте так для реальных кошельков). У меня получился сид someone salt electric gravity crane obvious problem lumber census crumble beyond history. Берём первые шесть слов от него:
someone-salt-electric-gravity-crane-obvious.
Заполняем список сайтов, для которых нужно получить пароли:
1. Google - Someone-salt-electric-gravity-01
2. Facebook - Salt-electric-gravity-crane-02
3. Upwork - Electric-gravity-crane-obvious-03
4. Behance - Gravity-crane-obvious-someone-04
Всё, мы составили список сайтов по какому-то критерию, записали, первые несколько запомнили. 6 слов сида и схему тоже запомнили. Со схемой слишком сильно не мудрим, это не прибавляет реальной защиты и только запутаем самих себя.
Для хранения паролей по такой системе достаточно выписать мастер-сид и вести пополняемый список сайтов. Первые несколько запомнить. Хранить на одном носителе или разделить на постоянный сид и пополняемый список сайтов в другом месте.
Если понадобится сменить пароль от сайта, то вычеркиваем его из списка, не удаляем строку, чтобы индексы не сдвинулись, потом добавляем сайт ещё раз в конец:
5. Google - Crane-obvious-someone-salt-05
То есть просто продолжаем снова сдвигать слова и добавлять индексы. После конца строки следующее слово берём снова с начала сида. Индексы как раз нужны, чтобы при полном обороте получился новый пароль Someone-salt-electric-gravity-07.
Когда список засорится, время начать новый сид и сменить пароли. Для разных систем профилей, например личных и рабочих, можно держать разные сиды. Всё это полностью совместимо с парольным менеджером, но теперь не беспомощны без него.
Кажется, что четыре словарных слова это мало и "легко подобрать". Зная схему и список сайтов, но не сид, это 44+5 или +6 бит энтропии. Реально, не зная схемы, потребуется даже зная, что "там bip39 слова", перебор большей части пароля, и энтропия будет выше. С полным перебором энтропия уходит за 120 бит, и дальше считать нет смысла - не поддаётся перебору и в локале без ограничений.
В веб-среде с лимитом на запросы, даже без 2FA, подбор нереальный. На почти всех важных сервисах есть 2FA, поэтому "короткий" пароль будет достаточно надёжным. Для важных сервисов можно увеличить окно и как-то пометить размер окна сдвига:
6. Binance (6) - Obvious-someone-salt-electric-gravity-crane-06
Да, их можно встроить прямо в общий поток, не меняя схемы. Саму схему модифицируйте на своё усмотрение: меняйте разделители, вид и положение индексов, позиции больших букв. Сохраняйте схему в секрете и достаточно "незабываемой" для себя, запишите, если требуется. Только чем больше частей в одном виде и месте, тем слабее способ.
Итог
Все системы составления и хранения паролей обладают списком преимуществ и недостатков. Выбирайте под задачу. У вас всегда будет тот самый "фатальный недостаток". Важно понимать и снижать его влияние. Метод "всё в голове" приводит к "один пароль под все сайты, не меняли годами, поменяли и забыли". Придётся создавать артефакт хранения: носитель или алгоритм. Или хуже - и носитель, и алгоритм.
Метод "помню соль и функцию" подходит для восстановления списка паролей "из ничего", но получаем множество ограничений на сам пароль, и они становятся незапоминаемыми. Метод "помню сид и список важного, остальное записано" подойдет для восстановления самого критичного ещё быстрее, даже без функции. Обычно, получив доступ к емайлу, можно восстановить всё остальное. Другие емайлы часто сбрасываются на резервный.
Естественно, всё это не заменяет парольный менеджер и пользоваться им стоит. У вас есть варианты "что делать, если его сейчас нет".
Так же, можно совместить метод хеширования и наложить его на словарь. Это уже выходит за рамки рассматриваемого метода, хотя направление перспективное: способ с хешированием получит запоминаемость и вводимость, но получит привязку к инструменту - уже не пойдет любой онлайн-хешер. Тогда программа генерации сама станет частью системы хранения, более сложной, чем листок или текстовый файл. Если получится подобрать метод хеширования, который легко написать заново из ничего, то этот недостаток становится незначительным.