Продвинутый бекап сид-фраз или история о том, как я друзьям свою сид-фразу раздавал

 Публичный пост
4 февраля 2023  1837

Привет, Клуб!

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

Именно так и выглядит тот самый сосед
Именно так и выглядит тот самый сосед

И есть ли способ сохранить сид-фразу (и не только) децентрализовано, не передавая в интернет, и в целом безопасно? И да, такое уже придумали!

Математическое душнилово

Основное, что нам поможет в этом нелегком деле: схема разделения секрета Шамира. Звучит страшно, на википедии вместо человеческого языка какие-то математические иероглифы, но... это нам не помешает : )

Простым языком объяснить эту магию можно так: вот это математическое чудо нам позволяет разделить данные так, чтобы из N всех частей любые K смогли выдать нам исходный секрет (то есть исходные данные). При этом из одного куска мы ничего не сможем восстановить: даже если мы разделили таким образом обычный "Hello, World" - во всех частях получится бинарное месиво.

Свои велосипеды и костыли

В linux-дистрибутивах уже давно есть ssss. Но мне кажется, что оно как-то на меня злобно шипит... Ну я взял, и написал свою штуку: https://github.com/isKONSTANTIN/CryptoUtils

Как хорошо, что схему Шамира уже умные люди реализовали за меня на Java, поэтому я просто подключил библиотеку.

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

А вот сгенерированная нейросетью иконка для репозитория в Gitlab - получилось интересно : )
А вот сгенерированная нейросетью иконка для репозитория в Gitlab - получилось интересно : )

Осталось дело за малым: сделать, собственно, бекап...

Не_много паранойи

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

Да, это правильные мысли. Конечно, открытый исходный код утилиты позволяет каждому лично убедиться, что она никуда не передает ценные сид-фразы на непонятный сервер, но... все равно же есть риск утечки из-за уязвимости, например, операционной системы, правильно?

Именно поэтому делаем несколько простых действий: физически отключаем все диски от материнки, грузимся в Live Boot, скачиваем условные JRE и физически выдергиваем Ethernet-провод. После этого можем вводить сид-фразу и работать с ней.
А после того, как дело сделано - выключаем комп, подключаем диски и грузимся. Теоретически, интернет подключать стоит только после полной прогрузки системы, чтобы оперативную память подтерло. Хотя, кажется, последнее больше на бред смахивает...

В общем, я так и сделал.

Немного о контейнерах

Я решил, если можно так сказать, забекапить еще и сами бумажки - заказал с али алюминиевые цилиндры: тык

Фотка моих c али, хотя там и другие виды есть
Фотка моих c али, хотя там и другие виды есть

Да-да, изначально предполагалось, что это контейнер для таблеточек. Но да и пофиг, засунуть туда бумажки это не мешает : )

За 5 штук вышло 500 рублей. Да, доставка отдельно. Как я понимаю, продавцы так искусственно "снижают" цену. Но да не суть.

А дальше все по методичке выше: отключение дисков, live boot...

К делу

Все приготовления закончены, перейдем сразу в терминал cu (CryptoUtils):

  1. Для начала, я перевел 24 слова в исходную энтропию в base64. В моей утилите делается с помощью команды seed_to_base. Так сид получается банально короче, хотя по идее байтики мы могли бы записать напрямую, без обертки в виде base64
  2. Затем, записав в файл полученную строчку, я зашифровал своим GPG ключом. Это делать необязательно, но почему бы не сделать дополнительный слой защиты?
  3. Разделил с помощью команды shamir. Так как у меня 5 контейнеров, соответственно и 5 частей. А для восстановления указал 3 - посчитал, что это оптимальный вариант в моем случае.
  4. Перевел бинарные файлы в hex-строчки для последующей печати. На этом месте, кстати, можно перевести данные в QR-код: в утилите есть команда для этого. Но, как показали тесты, изображение должно быть просто идеальным для сканирования. Но ничего не мешает скомбинировать это дело (хотя в моем случае мешал размер контейнера)
  5. Печать, обмазывание скотчем, упаковка.

Со своим GPG ключом, что шифровал сид, поступил аналогично.

Ну и наконец, результат:

Вот так скромно и лампово это дело выглядит : )
Вот так скромно и лампово это дело выглядит : )

Кстати, важное уточнение: для восстановления нужно знать порядковый номер части. Поэтому все внимательно нумеруем. Я сделал это и на бирке контейнера, и на бумажке с сид-фразой, и на бумажке с GPG ключом.

Раздача и итог

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

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

Связанные посты
37 комментариев 👇

Один из крестражей должен быть змея

  Развернуть 1 комментарий

Как-то мне кажется что шанс утери маленькой ненужной вещицы у доверенных лиц очень высок.)
Думаю если есть такая сохранить, то на ум приходит банковская ячейка. Думаю сохранность там будет в разы выше.

  Развернуть 1 комментарий

@ZaraThustra, действительно, контейнеры на столько маленькие, что потерять их не сложно. Но они и не таскаются нигде, как и сравнительно такой же по размерам листок с сид-фразой - тупо лежит в ящике. Только одновременно в N местах : )

Да и плюсом к этому, ничего не мешает распечатать каждую часть аш на A4 лист

  Развернуть 1 комментарий

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

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

  Развернуть 1 комментарий

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

С другой стороны, я не думаю, что условные документы на машину/дом/??? теряются по приципу "ой, я вот куда-то сюда сувал, а оно пропало".

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

На счет шанса расшифровки - не уловил тейк. В любом случае, схема широко используется и проблем с ней не слышал.
К тому же, лично я шифранул nistp256-ключиком. Он же, наверное, только квантовым компьютером и ломается : )

  Развернуть 1 комментарий

@isKONSTANTIN, Я к тому что вместо пяти частей в каждый из пяти положить полный ключ. Но если уже в этой шифровке ещё к примеру первые три символа поместить в конец, запомнить это не сложно, но какой уже после этого шанс что даже имя ключ на руках кто-то сможет им воспользоваться?

  Развернуть 1 комментарий

@ZaraThustra, Если мы положим полный ключ - тогда, логично предположить, риск раскрытия у нас достигнет 100% : D

А с перемещением символов у нас получается что-то в духе шифра Цезаря, которое ломается очень легко : D

  Развернуть 1 комментарий

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

  Развернуть 1 комментарий

@ZaraThustra, шифр Цезаря - да, легко, в отличии от первоначальной шифровки через условный GPG.

А разделение схемой Шамира, в отличии от Цезаря, дает "бонус" к защите - ни у кого нет даже зашифрованного варианта ключа.

  Развернуть 1 комментарий

@ZaraThustra, сейчас будет очень частный случай, но я когда-то делил секрет на 4 части, две которые передавал "близким". Не потеряли, в нужный момент я обратно получил их кусочки :-)

  Развернуть 1 комментарий

@isKONSTANTIN, именно так доки и теряются у меня. Я думал что положил х в у но его там нет = паника и рыскание по всему дому.

  Развернуть 1 комментарий

@kstgrd, ужас какой : )
Думал, иметь единственную выделенную полку/ящик в доме - нормальная практика. У меня никогда ничего не терялось, в последний раз даже нашлось то, о чем я сам забыл : )

  Развернуть 1 комментарий

@isKONSTANTIN, запасной ключ от машины, не могу забрать у друга уже около 10 лет. С каждым следующим его переездом, шанс, что он его найдет снижается.

  Развернуть 1 комментарий

@Normaldini, забавно. Я попросил друга сразу возвращать кейс в случае переезда : )

  Развернуть 1 комментарий
Petr Korolev ETHusiast in open-source & privacy 4 февраля 2023

Ты крут! Отлично,что вынес такую штуку из кулуаров чата Вастрик.крипты и увековечил.

Также Призываю @kirushik добавить пару слов про его широко известную в узких кругах тулзу https://github.com/paritytech/banana_split

У меня так и не дошли ещё руки это все сделать. Но кажется будет интесно вас соединить 😀

  Развернуть 1 комментарий

@skywinder, Как попасть в кулуары?

  Развернуть 1 комментарий

ну. @Normaldini, я даже ссылку оставил выше на чат)

upd:
my bad. там приватная группа. вот cсылка на приглашение:
https://t.me/+4WRCjL_xTFQ5NmNi

  Развернуть 1 комментарий

Всякий раз когда сталкиваюсь с любым проявлением мнемонических фраз сразу вспоминаю батл Хованского и Ларина. "Пророк брошюра крекер крен рефрактор руль квартира рессора трувер версус рэп прораб ресурс придира...."

  Развернуть 1 комментарий

@kstgrd, есть идея: сделать свой такой словарь параллельно с BIP39. Будет весело : D

  Развернуть 1 комментарий

Любой бекап хорош до первой попытки восстановления :) Ты попробовал провести обратную процедуру - по трем случайным фрагментам получить сид фразу?

  Развернуть 1 комментарий

@glader, ага, на каждом этапе производил обратный процесс со сравнением хеш сумм, в том числе и с шамиром.

По хорошему бы нужно сделать тесты для проверки работы команд и в целом кода - думаю на недели сделаю : )

  Развернуть 1 комментарий
Egor Tashchilin Мягкий директоро 6 февраля 2023

Осталось только понять что делать если нет друзей....

  Развернуть 1 комментарий

@pihta, банковские ячейки в нескольких странах :)

  Развернуть 1 комментарий

@pihta, : C

Я бы поступил так:
1 контейнер - у себя
2, 3 контейнер - родственникам, маме и т.п.
4, 5 контейнер - в ячейки разных банков/отделений

  Развернуть 1 комментарий

@isKONSTANTIN, это работает, если родственники и банки есть рядом, а если ты иммигрант, то родственники в другой стране, а банки многие нонче не имеют ячеек

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

Вопрос конечно с хранением доступа к хостингам, если все в менеджере паролей - то он слабое звено.

  Развернуть 1 комментарий

@pihta, ух, вот это действительно сложная ситуация. Возможно, стоит кого-то даже из клуба попросить хранить физически такое, чем публиковать в интернет.

Интернет помнит все, и в случае обнаружения уязвимостей какого-либо из алгоритмов (шифрования или же Шамира) - пиши пропало.

  Развернуть 1 комментарий

@isKONSTANTIN, ну и защита должна быть адекватна защищаемому.

  Развернуть 1 комментарий

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

Я просто перевёл слова в том же порядке на русский, добавил окончания, союзы и всё такое, чтобы получилось связное предложение. И передал это доверенным, не объясняя что эта фраза означает) Вышло, кстати, достаточно философское изречение))

  Развернуть 1 комментарий

@VladAbramov, забавно : )

Хотя я бы так не делал, потому что тут и шифрования толком нет, и вариантов перевода одного и того же слова может быть несколько. Но это я уже душнить начинаю : )
Вот, кстати, интересный видос про историю шифрования:


Как раз объясняется, почему атакующая сторона априори знает алгоритм шифрования. Ну и не только : )

  Развернуть 1 комментарий

А мы рассматриваем собственно созданные мнемонические фразы или вопрос только в хранении случайно созданных?

  Развернуть 1 комментарий

@ZaraThustra, м... есть фундаментальное отличие?

Я рассматриваю разделение и раздачу доверенным лицам как дополнение к хранению фразы у себя на листочке

  Развернуть 1 комментарий

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

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

  Развернуть 1 комментарий

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

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

  Развернуть 1 комментарий
Egor Tashchilin Мягкий директоро 6 февраля 2023

Со своим GPG ключом, что шифровал сид, поступил аналогично.

Тоже поделил на 5 частей и положил каждую часть по контейнерам?

  Развернуть 1 комментарий

@pihta, агась

  Развернуть 1 комментарий

@isKONSTANTIN, а GPG ключ имеет пароль, который ты помнишь, так? Иначе та же группа "друзей" по сговору может получить и фразу и GPG ключ

  Развернуть 1 комментарий

@pihta, конечно, об этом я и написал в конце: "... Да, ключик они получат, но там стоит пароль, что не даст расшифровать сид."

  Развернуть 1 комментарий

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб