Привет, Клуб!
Как-то на днях я подумал, что хранение мнемонической фразы просто на листочке может быть не очень безопасно. Ну знаете, бывают же пожары там всякие, злой сосед специально устроит потоп над ящиком с ценным листком бумаги…
И есть ли способ сохранить сид-фразу (и не только) децентрализовано, не передавая в интернет, и в целом безопасно? И да, такое уже придумали!
Математическое душнилово
Основное, что нам поможет в этом нелегком деле: схема разделения секрета Шамира. Звучит страшно, на википедии вместо человеческого языка какие-то математические иероглифы, но... это нам не помешает : )
Простым языком объяснить эту магию можно так: вот это математическое чудо нам позволяет разделить данные так, чтобы из N всех частей любые K смогли выдать нам исходный секрет (то есть исходные данные). При этом из одного куска мы ничего не сможем восстановить: даже если мы разделили таким образом обычный "Hello, World" - во всех частях получится бинарное месиво.
Свои велосипеды и костыли
В linux-дистрибутивах уже давно есть ssss. Но мне кажется, что оно как-то на меня злобно шипит... Ну я взял, и написал свою штуку: https://github.com/isKONSTANTIN/CryptoUtils
Как хорошо, что схему Шамира уже умные люди реализовали за меня на Java, поэтому я просто подключил библиотеку.
А вообще, изначально эта утилита была создана для быстрой генерации сида и шифрования для последующей передачи, но команды для бекапа и восстановления отлично сюда вписались.
Осталось дело за малым: сделать, собственно, бекап...
Не_много паранойи
... Погодите, а как безопасно работать с сид-фразой на компьютере, если ее нельзя никуда вводить? Уж тем более в программу какого-то ноунейма. Ну нафиг...
Да, это правильные мысли. Конечно, открытый исходный код утилиты позволяет каждому лично убедиться, что она никуда не передает ценные сид-фразы на непонятный сервер, но... все равно же есть риск утечки из-за уязвимости, например, операционной системы, правильно?
Именно поэтому делаем несколько простых действий: физически отключаем все диски от материнки, грузимся в Live Boot, скачиваем условные JRE и физически выдергиваем Ethernet-провод. После этого можем вводить сид-фразу и работать с ней.
А после того, как дело сделано - выключаем комп, подключаем диски и грузимся. Теоретически, интернет подключать стоит только после полной прогрузки системы, чтобы оперативную память подтерло. Хотя, кажется, последнее больше на бред смахивает...
В общем, я так и сделал.
Немного о контейнерах
Я решил, если можно так сказать, забекапить еще и сами бумажки - заказал с али алюминиевые цилиндры: тык
Да-да, изначально предполагалось, что это контейнер для таблеточек. Но да и пофиг, засунуть туда бумажки это не мешает : )
За 5 штук вышло 500 рублей. Да, доставка отдельно. Как я понимаю, продавцы так искусственно "снижают" цену. Но да не суть.
А дальше все по методичке выше: отключение дисков, live boot...
К делу
Все приготовления закончены, перейдем сразу в терминал cu (CryptoUtils):
- Для начала, я перевел 24 слова в исходную энтропию в base64. В моей утилите делается с помощью команды seed_to_base. Так сид получается банально короче, хотя по идее байтики мы могли бы записать напрямую, без обертки в виде base64
- Затем, записав в файл полученную строчку, я зашифровал своим GPG ключом. Это делать необязательно, но почему бы не сделать дополнительный слой защиты?
- Разделил с помощью команды shamir. Так как у меня 5 контейнеров, соответственно и 5 частей. А для восстановления указал 3 - посчитал, что это оптимальный вариант в моем случае.
- Перевел бинарные файлы в hex-строчки для последующей печати. На этом месте, кстати, можно перевести данные в QR-код: в утилите есть команда для этого. Но, как показали тесты, изображение должно быть просто идеальным для сканирования. Но ничего не мешает скомбинировать это дело (хотя в моем случае мешал размер контейнера)
- Печать, обмазывание скотчем, упаковка.
Со своим GPG ключом, что шифровал сид, поступил аналогично.
Ну и наконец, результат:
Кстати, важное уточнение: для восстановления нужно знать порядковый номер части. Поэтому все внимательно нумеруем. Я сделал это и на бирке контейнера, и на бумажке с сид-фразой, и на бумажке с GPG ключом.
Раздача и итог
Дальше эти контейнеры я спокойно раздаю доверенным лицам: бабули, близким друзьям, и так далее. Даже если теоретически 3 человека скооперируются, они не смогут восстановить сид - он зашифрован ключом (именно поэтому и шифровал дополнительно). Да, ключик они получат, но там стоит пароль, что не даст расшифровать сид.
Вот такие пироги : )
Буду очень рад звездочкам на гитхабе, токсичных issue там же, да и просто идей и мыслей в комментариях.
Как-то мне кажется что шанс утери маленькой ненужной вещицы у доверенных лиц очень высок.)
Думаю если есть такая сохранить, то на ум приходит банковская ячейка. Думаю сохранность там будет в разы выше.
А мы рассматриваем собственно созданные мнемонические фразы или вопрос только в хранении случайно созданных?
Ты крут! Отлично,что вынес такую штуку из кулуаров чата Вастрик.крипты и увековечил.
Также Призываю @kirushik добавить пару слов про его широко известную в узких кругах тулзу https://github.com/paritytech/banana_split
У меня так и не дошли ещё руки это все сделать. Но кажется будет интесно вас соединить 😀
Один из крестражей должен быть змея
Всякий раз когда сталкиваюсь с любым проявлением мнемонических фраз сразу вспоминаю батл Хованского и Ларина. "Пророк брошюра крекер крен рефрактор руль квартира рессора трувер версус рэп прораб ресурс придира...."
Любой бекап хорош до первой попытки восстановления :) Ты попробовал провести обратную процедуру - по трем случайным фрагментам получить сид фразу?
Тоже поделил на 5 частей и положил каждую часть по контейнерам?
Осталось только понять что делать если нет друзей....
Не знал про схему разделения Шамира, задумка выглядит потрясно.
Для себя сделал похожим, но всё-таки другим образом.
Было важно уметь достаточно оперативно получать мнемоник-фразу обратно. Если я потеряю сид-фразу, то пойму я это ровно в тот момент, когда мне нужно будет заюзать кошелёк :) И дёргать даже двух разных контактов может быть слишком долго.
Я просто перевёл слова в том же порядке на русский, добавил окончания, союзы и всё такое, чтобы получилось связное предложение. И передал это доверенным, не объясняя что эта фраза означает) Вышло, кстати, достаточно философское изречение))