После того как Google отказалась от паролей и перешла на Passkey по умолчанию создаётся впечатление, что концепция текстовых паролей (парольных фраз) сама по себе устарела. И действительно, в некоторых случаях можно добиться достаточного уровня безопасности без паролей вообще.
Например, простенькая утилита horcrux (крестраж*) разбивает файл на несколько зашифрованных частей (например, пять), причём для дешифровки и восстановления исходного текста не нужен пароль, а нужно найти и соединить несколько из этих частей (например, три). Предполагается, что сами отдельные части хранятся у разных людей в разных местах и/или надёжно спрятаны, например, в разных местах дома, сейфах, банковских ячейках и т. д.
*Крестраж — волшебный артефакт, созданный с помощью тёмной магии, из вселенной Гарри Поттера.
Общий принцип программы показан на КДПВ. В программе
horcrux
две команды: split
и bind
для разбиения файла и соединения частей (крестражей). Как несложно догадаться, здесь используется схема разделения секрета Шамира.Например, если в текущем каталоге есть файл с названием
habr.txt
, то можно запустить команду разбиения на части:$ horcrux split habr.txt
Утилита спросит, сколько крестражей создать и сколько их потребуется для восстановления исходного файла. Если мы хотим пять и три, то указываем эти цифры — и программа создаёт файлы следующим образом:
habr_1_of_5.horcrux
habr_2_of_5.horcrux
...
Как вариант, можно сразу указать эти параметры в командной строке:
$ horcrux -t 3 -n 5 split habr.txt
Результат будет идентичным.
Как видим, каждый из зашифрованных файлов по размеру больше исходного:
Это указывает на то, что по схеме Шамира разделяется не сам файл, а ключ для дешифрования. В реальности каждый из фрагментов хранит всю исходную информацию.
Остаётся лишь разбросать крестражи по дому на USB-флэшках или на разных хостингах в интернете.
Для восстановления исходного файла теперь нужно вспомнить не пароль, а места, где спрятаны крестражи. Это тоже может быть сложной задачей, особенно если артефакты очень хорошо спрятаны, например, закопаны в необитаемой местности без опознавательных знаков.
Восстановление оригинального файла при наличии зашифрованных частей осуществляется командой
bind
с указанием папки, где находятся файлы:$ horcrux bind d:\secrets\
Исходный файл будет воссоздан.
Теоретически, эта программа может заменить или дополнить классическое шифрование (с паролем) в следующих случаях:
- для долговременного хранения конфиденциальной информации в течение десятилетий, когда человек не чувствует уверенности в том, что сохранит или запомнит пароль;
- для передачи конфиденциальной информации по открытым каналам, чтобы минимизировать риск перехвата.
Нужно добавить, что шифрование крестражей не отменяет возможности шифрования открытого текста перед его разбиением на части. То есть можно зашифровать (или заархивировать) файл с использованием пароля — а потом разбивать на части. Это обеспечит дополнительный уровень защиты.
Установка программы под Linux:
curl https://api.github.com/repos/jesseduffield/horcrux/releases/latest | \
jq '.assets[] | select(.browser_download_url | endswith("_Linux_x86_64.tar.gz")) | .browser_download_url' | \
xargs curl -Lo /tmp/horcrux.tar.gz && \
tar xfz /tmp/horcrux.tar.gz -C /tmp && \
rm /tmp/horcrux.tar.gz && \
sudo mv /tmp/horcrux /usr/local/bin/horcrux
Установка под Windows через консольный инсталлятор Scoop:
Только сначала нужно установить Scoop следующими командами в консоли:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time
irm get.scoop.sh | iex
Если запускаете консоль из-под админа, то Scoop устанавливается такой командой:
iex "& {$(irm get.scoop.sh)} -RunAsAdmin"
Кстати, есть похожий инструмент paperback, он тоже разделяет по схеме Шамира ключ для дешифрования, причём распечатывает его в бумажном виде (генерирует PDF). Пароль тоже помнить необязательно, главное собрать части ключа на бумаге. Ниже примеры.
Основной документ:
Часть ключа:
Предостережение о блочных шифрах
Программа
horcrux
использует шифр AES в режиме OFB. Режим обратной связи по выходу (output feedback, OFB) превращает блочный шифр в синхронный потоковый шифр. В процессе шифрования генерируются блоки потока ключа. Для получения шифротекста они соединяются с блоками открытого текста.
Благодаря симметрии XOR шифрование и дешифрование выполняются одинаково:
Шифрование и дешифрование в режиме OFB происходит по одинаковой схеме
Нужно заметить, что это не самый надёжный вариант с точки зрения безопасности. Если упростить вышеприведённую схему, то потоковый шифр работает следующим образом (через XOR):
шифротекст = открытый_текст ^ сгенерированный_поток_ключа(ключ) открытый_текст = шифротекст ^ сгенерированный_поток_ключа(ключ)
Проблема здесь довольно очевидна, и она общая для всех шифров такого класса. Как и в других потоковых шифрах, замена одного бита в шифротексте приводит к замене бита в открытом тексте в том же месте. Это свойство позволяет нормально функционировать многим кодам с коррекцией ошибок даже при их применении до шифрования.
С другой стороны, это даёт потенциальным злоумышленникам возможности для «порчи» зашифрованных файлов.
Очень часто злоумышленнику известно содержимое части открытого текста — например, это могут быть стандартные заголовки файлов определённого формата. Имея исходный текст и результат шифрования, он может выполнить вычисления — и заменить конкретные байты шифротекста на такие значения, которые дадут нужный результат после расшифровки. То есть он может подменить фрагменты зашифрованного файла, не зная ключа. Эту особенность следует всегда иметь в виду, когда работаешь с блочными шифрами.
Комментарии (8)
Vest
26.11.2023 19:19Как-то дороговато выходит шифрование большого файла. Это надо собрать три экземпляра в одном каталоге и потом они расшифруются еще в один экземпляр.
Наверное, это больше для текста (с паролями :) ).
alexs963
26.11.2023 19:19+3Можно шифровать файл отдельно, а делить на части ключ от него.
martin_wanderer
26.11.2023 19:19Складывается впечатление, что ровно дня этого схема и придумана: для обеспечения только совместного доступа к некоторому ключу
ky0
26.11.2023 19:19+2Когда гуглил разделяемые секреты, больше всего мне понравилась вот эта штука: https://github.com/paritytech/banana_split
Не требует установки, всё происходит локально в браузере.
quarus
26.11.2023 19:19для восстановления секрета
N
требуется только большая часть этих частей ( ).N/2+1
А в чём прелесть усложнения засекречивания для упрощения рассекречивания?... Не вижу в этом большого смысла, разве что при делегировании доступа при голосовании (как раз требуется N/2+1 голосов, т.е. >50%). М.б. кто-то пояснит.
ky0
26.11.2023 19:19Ну вот, скажем, боитесь вы летать на самолётах. И перед каждым путешествием потеете и думаете, как оставить жене реквизиты от криптовалютного кошелька - но таким образом, чтобы она смогла им воспользоваться только если с вами что-то случится, а не через 10 минут после отправления рейса.
Берёте помимо неё ещё четверых людей, которым доверяете - и подготавливаете 5 ключей, из которых нужно 3, чтобы собрать секрет. Объясняете, что отдавать свой ключ стоит только, скажем, после оформления свидетельства о смерти.
quarus
26.11.2023 19:19Спасибо, это примерно та же ситуация, что я описал выше (когда требуется кворум), только ещё жену надо будет научить как этим воспользоваться :), но именно для шифрования данных, я не вижу смысла.
olartamonov
Вообще типовое применение схемы Шамира — это не прятание данных от кого-то по частям (и вообще мы тут смотрим про security through obscurity), а гарантия невозможности совершения какого-либо действия без достижения консенсуса между несколькими людьми (системами, etc.).
Пока минимум N из M владельцев частей ключа не соберутся вместе, действие совершить невозможно, при этом это могут быть любые N из M, потому что как только они собрались — дополнительных уникальных знаний для совершения действия не требуется («пароль не нужен»).