Офлайн-генерация ключей: руководство по безопасности Air-Gapped
Генерация криптовалютных ключей на компьютере, подключенном к интернету, подвергает их риску вредоносного ПО, кейлоггеров, перехвата экрана, подмены буфера обмена и удаленной эксфильтрации. Для кошельков высокой ценности, предназначенных для долгосрочного холодного хранения, золотым стандартом является air-gapped офлайн-генерация: создание ключей на устройстве, которое никогда не было и никогда не будет подключено к какой-либо сети.
Это руководство дает подробный пошаговый процесс офлайн-генерации ключей: от выбора оборудования и настройки ОС до генерации ключей, проверки и безопасной очистки.
Почему Air-Gapped-генерация важна
Модель угроз
Когда вы генерируете seed-фразу или приватный ключ на обычном компьютере, ключевой материал существует в:
- RAM — доступна любому процессу, работающему в системе.
- Диске — может быть выгружен на диск системой виртуальной памяти ОС.
- Буфере обмена — при копировании/вставке доступен каждому приложению.
- Сети — если машина подключена, вредоносное ПО может мгновенно вывести ключи.
- Дисплее — вредоносное ПО для захвата экрана или подсматривание через плечо.
- Клавиатуре — кейлоггеры (программные или аппаратные) записывают весь ввод.
Air-gapped компьютер полностью устраняет сетевой вектор. В сочетании с корректной операционной безопасностью это также существенно снижает или устраняет остальные векторы.
Кому нужна Air-Gapped-генерация?
- Всем, кто хранит больше, чем может позволить себе потерять.
- Для долгосрочного «глубокого холода» (годы или десятилетия).
- Для институционального хранения и управления казначейством.
- Всем, кто хочет максимально достижимый стандарт безопасности.
Для повседневных расходных кошельков с небольшими балансами аппаратный кошелек дает достаточную безопасность без сложности air-gapped-процедур.
Выбор оборудования
Вариант 1: Выделенный ноутбук (рекомендуется)
Купите новый или сброшенный до заводских настроек ноутбук, который будет использоваться исключительно для генерации ключей и никогда не будет подключаться к интернету:
- Удалите или отключите все сетевое оборудование. По возможности физически извлеките Wi-Fi-карту и модуль Bluetooth. Как минимум отключите их в прошивке BIOS/UEFI.
- Отключите камеру и микрофон. Удалите их или физически закройте/отсоедините.
- Используйте ноутбук без сотового модема.
- Бюджетные варианты: б/у ThinkPad (X230, T440) — недорогие, хорошо поддерживаются Linux, легко модифицируются физически.
Вариант 2: Raspberry Pi
Raspberry Pi (модель 3B+ или 4) — недорогой одноплатный компьютер без Wi-Fi, если использовать Pi Zero без беспроводного модуля или отключить сеть:
- Загрузка с microSD-карты.
- Нет постоянного хранилища кроме SD-карты (которую вы уничтожите после).
- Нет беспроводного оборудования при выборе правильной модели.
- Низкая стоимость ($35–$75 с аксессуарами).
Вариант 3: Live USB на существующем оборудовании
Загрузите выделенный Linux live USB на существующем компьютере с полностью отключенной сетью:
- Live-среда работает полностью в RAM.
- Данные не записываются на внутренний диск (при правильной конфигурации).
- После выключения RAM очищается.
- Риск: существующий компьютер может иметь аппаратные компрометации (руткиты прошивки, аппаратные кейлоггеры), которые сохраняются между загрузками ОС. Выделенное устройство устраняет этот риск.
Настройка операционной системы
Tails OS (рекомендуется)
Tails — Linux-дистрибутив, ориентированный на приватность и отсутствие следов:
- Загружается с USB и работает полностью в RAM.
- Вся сеть по умолчанию направляется через Tor — но для air-gapped-использования сеть вообще не включается.
- Рассчитан на «амнезийное» использование: без постоянного состояния, если оно не настроено явно.
- Включает распространенные инструменты и может запускать Python-скрипты для генерации ключей.
Шаги настройки:
- Скачайте Tails ISO на обычном компьютере.
- Проверьте подпись ISO с помощью ключа подписи Tails.
- Запишите ISO на USB-накопитель через Tails Installer, Etcher или
dd. - Загрузите air-gapped-компьютер с USB.
- В Tails Greeter не настраивайте сетевое подключение.
- Убедитесь, что сетевые интерфейсы не активны:
ip link showдолжен показывать все интерфейсы в состоянии DOWN.
Ubuntu Live USB (альтернатива)
Если Tails не подходит:
- Скачайте Ubuntu ISO и проверьте его checksum.
- Запишите на USB.
- Загрузитесь с отключенной сетью в BIOS.
- В установщике Ubuntu выберите «Try Ubuntu» (не устанавливайте).
- Убедитесь в отсутствии сетевого подключения.
Проверка целостности Air-Gap
После загрузки проверьте air gap:
# Check that no network interfaces are UP
ip link show
# Verify no IP addresses assigned
ip addr show
# Attempt to reach the internet (should fail)
ping -c 1 8.8.8.8
# Check for Wi-Fi and Bluetooth
rfkill list all
Все сетевые интерфейсы должны быть в состоянии DOWN, IP-адреса не должны быть назначены, а ping должен завершиться с ошибкой. Если какой-либо тест указывает на подключение, остановитесь и устраните проблему перед продолжением.
Процесс генерации ключей
Метод 1: использование инструментов SafeSeed офлайн
Инструменты SafeSeed — это клиентские веб-приложения, которые могут работать в браузере без подключения к интернету.
SafeSeed Seed Phrase Generator и Paper Wallet Creator можно сохранить для офлайн-использования. Перед переходом в офлайн сохраните страницу целиком (Ctrl+S / Cmd+S), перенесите ее на air-gapped-компьютер через USB и откройте в браузере. Все криптографические операции выполняются локально в JavaScript — связь с сервером не требуется.
Шаги:
- На обычном (онлайн) компьютере перейдите к инструменту SafeSeed.
- Сохраните страницу целиком на USB-накопитель.
- Проверьте целостность файла (сравните checksum, если доступны).
- Перенесите USB-накопитель на air-gapped-компьютер.
- Откройте сохраненный HTML-файл в браузере.
- Сгенерируйте seed-фразу.
- Запишите ее на бумаге (не сохраняйте в цифровом виде на air-gapped-машине).
- Проверьте seed-фразу: введите ее повторно и убедитесь, что генерируются те же адреса.
Метод 2: использование BIP-39 инструмента Ian Coleman
BIP-39 инструмент Ian Coleman — open-source автономная HTML-страница, широко используемая для офлайн-генерации ключей:
- Скачайте последний релиз с GitHub на онлайн-компьютере.
- Проверьте PGP-подпись.
- Перенесите на air-gapped-компьютер через USB.
- Откройте
bip39-standalone.htmlв браузере. - Сгенерируйте или введите мнемонику.
- Выберите монету и путь деривации.
- Запишите seed-фразу и адреса.
Метод 3: энтропия на основе игральных костей
Для максимального недоверия ко всем программным RNG можно генерировать энтропию вручную с помощью костей:
- Используйте кости казино-класса (точные кости с острыми гранями, а не округленные потребительские).
- Бросьте одну кость 99 раз для 256 бит энтропии (каждый бросок дает ~2.585 бита; 99 бросков дают ~255.9 бита).
- Преобразуйте результаты бросков в бинарную строку.
- Используйте BIP-39 инструмент (офлайн), чтобы преобразовать бинарную энтропию в мнемонику.
- Либо бросьте кость 50 раз для 128 бит энтропии (фраза из 12 слов).
Методы преобразования костей:
- Метод base-6: запишите каждый бросок (1-6), преобразуйте последовательность в binary.
- Метод binary-костей: используйте монету (орел=1, решка=0) 256 раз.
- Кость-в-binary: бросьте кость; если 1-3, запишите 0; если 4-6, запишите 1. Повторите 256 раз.
Третий метод тратит больше всего энтропии, но он самый простой. Подробно о качестве энтропии см. в нашем руководстве по энтропии и случайности.
Метод 4: командная строка (Python)
Для пользователей, уверенно работающих с командной строкой, минимальный Python-скрипт может генерировать BIP-39 мнемоники:
import hashlib
import os
# BIP-39 word list must be loaded from a file
with open('english.txt', 'r') as f:
wordlist = [w.strip() for w in f.readlines()]
# Generate 256 bits of entropy
entropy = os.urandom(32) # Uses OS CSPRNG
# Compute checksum
h = hashlib.sha256(entropy).digest()
checksum_bits = bin(h[0])[2:].zfill(8) # First 8 bits for 256-bit entropy
# Convert entropy to binary string
entropy_bits = bin(int.from_bytes(entropy, 'big'))[2:].zfill(256)
all_bits = entropy_bits + checksum_bits
# Split into 11-bit groups and map to words
words = []
for i in range(0, len(all_bits), 11):
index = int(all_bits[i:i+11], 2)
words.append(wordlist[index])
print(' '.join(words))
Важно: это упрощенный пример для учебных целей. Для продакшена используйте хорошо аудированную библиотеку, например mnemonic из python-mnemonic.
Проверка
После генерации seed-фразы проверьте ее, прежде чем доверять ей средства:
1. Проверка checksum
Введите seed-фразу обратно в инструмент генерации. Если инструмент принимает ее без ошибки, checksum корректна.
2. Проверка деривации адресов
Выведите первые несколько адресов для целевой криптовалюты и пути деривации. Запишите эти адреса. Позже на отдельном устройстве (или после перезагрузки air-gapped-машины) снова введите seed-фразу и убедитесь, что генерируются те же адреса.
3. Кросс-проверка в разных инструментах
Если возможно, проверьте seed-фразу в двух разных инструментах (например, генератор SafeSeed и инструмент Ian Coleman). Оба должны выдавать идентичные адреса для одной и той же seed-фразы, пути деривации и passphrase.
4. Тест малой транзакцией
Перед хранением значительной суммы:
- Отправьте небольшое количество криптовалюты на первый receiving-адрес.
- На отдельном устройстве восстановите кошелек из seed-фразы.
- Убедитесь, что средства видны и вы можете подписать транзакцию для отправки обратно.
Это подтверждает всю цепочку: генерацию энтропии, кодирование мнемоники, деривацию seed, деривацию ключей и генерацию адресов.
Запись seed-фразы
Бумага
- Пишите разборчиво перманентной ручкой на бескислотной бумаге.
- Нумеруйте каждое слово (1-24).
- Не пишите на поверхности, где может оставаться оттиск (не пишите на блокноте, где следы видны на нижних листах).
- Храните в огнестойком и водонепроницаемом контейнере.
Металл
- Нанесите штамповкой или гравировкой на пластины из нержавеющей стали.
- При нехватке места протестируйте запись первыми четырьмя буквами слова.
- Сразу после штамповки проверьте читаемость.
- Металл переживает пожар и наводнение — рекомендуется для долгосрочного хранения.
Чего не делать
- Не фотографируйте seed-фразу.
- Не вводите ее в какой-либо файл на air-gapped-машине.
- Не печатайте ее (у принтеров есть память и сетевые возможности).
- Не сохраняйте ее на USB-накопитель.
Безопасная очистка
После генерации и записи seed-фразы удалите все следы с air-gapped-устройства:
1. Очистите буфер обмена и экран
- Закройте все приложения.
- Очистите буфер обмена (Ctrl+C любой нерелевантный текст).
2. Выключение
- Выключите компьютер. Содержимое RAM деградирует в течение секунд или минут после отключения питания.
- Для дополнительной уверенности оставьте устройство выключенным минимум на 15 минут (DRAM хранит данные меньше при комнатной температуре и дольше в холодной среде).
3. Носители данных
- Если используется Tails live USB, на диск ничего не записывается. USB можно использовать повторно.
- Если используется SD-карта Raspberry Pi с не-амнезийной ОС, безопасно очистите SD-карту (
dd if=/dev/urandom of=/dev/sdX bs=1M) или физически уничтожьте ее. - Если вы случайно сохранили что-то на внутренний диск air-gapped-машины, безопасно очистите его.
4. USB-накопитель
- USB-накопитель, использованный для переноса инструмента генерации, не должен содержать сгенерированный ключевой материал, если вы следовали инструкциям.
- Убедитесь, что на USB есть только исходные файлы инструмента и ничего больше.
- Для максимальной безопасности очистите USB после использования.
Дополнительно: подпись транзакций в Air-Gapped-среде
Air-gapped-компьютер полезен не только для генерации ключей, но и для постоянной подписи транзакций:
Рабочий процесс
- Онлайн-машина (watch-only): создайте неподписанную транзакцию.
- Передача: перенесите неподписанную транзакцию на air-gapped-машину через USB или QR-код.
- Air-gapped-машина: подпишите транзакцию приватным ключом.
- Передача: перенесите подписанную транзакцию обратно на онлайн-машину.
- Онлайн-машина: отправьте подписанную транзакцию в сеть.
Передача через QR-код (предпочтительно)
Использование QR-кодов полностью устраняет USB-накопители, закрывая потенциальный вектор вредоносного ПО (USB-устройства могут переносить автозапускаемые payload):
- Покажите неподписанную транзакцию как QR-код на онлайн-машине.
- Сканируйте QR-код камерой, подключенной к air-gapped-машине.
- Подпишите транзакцию.
- Покажите подписанную транзакцию как QR-код на air-gapped-машине.
- Сканируйте онлайн-машиной.
Кошельки, поддерживающие QR-ориентированную air-gapped-подпись: Coldcard, Keystone и Sparrow Wallet (с настройкой webcam).
PSBT (Partially Signed Bitcoin Transactions)
Формат PSBT в Bitcoin (BIP-174) был специально разработан для air-gapped-процессов. PSBT содержит всю информацию, необходимую для подписи транзакции, без необходимости иметь на подписывающем устройстве какие-либо данные блокчейна.
Multi-Signature Air-Gapped-настройка
Для максимальной безопасности объедините air-gapped-генерацию ключей и multi-signature:
- Сгенерируйте три отдельные seed-фразы в трех отдельных air-gapped-сессиях (в идеале на разных устройствах).
- Настройте 2-of-3 multi-signature-кошелек.
- Храните каждую seed-фразу в отдельной физической локации.
- Транзакции требуют подписи на двух из трех air-gapped-устройств.
Это защищает от:
- Одного скомпрометированного устройства (раскрыт только один ключ).
- Одной потерянной seed-фразы (оставшиеся два ключа по-прежнему могут подписывать).
- Одной скомпрометированной локации хранения.
Частые ошибки
Ошибка 1: использование «чистого», но ранее подключавшегося компьютера
Очистки и переустановки ОС на компьютере, который раньше подключался к интернету, недостаточно. Вредоносное ПО уровня прошивки (UEFI-руткиты) может переживать переустановку ОС. Выделенное устройство, никогда не подключавшееся к сети, устраняет этот риск.
Ошибка 2: подключение Air-Gapped-машины «на минуту»
Любое сетевое подключение, даже кратковременное, нарушает air gap. Вредоносное ПО может вывести приватный ключ за миллисекунды. После подключения устройство больше нельзя считать air-gapped.
Ошибка 3: использование принтера
У принтеров часто есть собственное хранилище (для буферизации задач печати), а у многих современных моделей есть Wi-Fi или Bluetooth. Печать seed-фразы может сохранить ее в памяти принтера и потенциально передать дальше. Вместо этого пишите вручную.
Ошибка 4: цифровая передача seed-фразы
Seed-фраза никогда не должна существовать в цифровой форме вне короткого момента отображения на air-gapped-экране. Не копируйте ее на USB-накопитель, не сохраняйте в файл и не кодируйте в QR-код для передачи. Записывайте на бумагу или штампуйте на металл напрямую.
Ошибка 5: отсутствие проверки инструмента генерации
Инструмент, который вы переносите на air-gapped-машину, должен быть проверен перед использованием. Проверяйте file hash, PGP-подписи или как минимум сравнивайте размер файлов. Подмененный инструмент может генерировать детерминированные ключи, которые атакующий уже знает.
FAQ
Почему просто не использовать аппаратный кошелек?
Аппаратные кошельки отличны и достаточны для большинства пользователей. Air-gapped-генерация дает дополнительный запас безопасности для очень больших сумм, потому что устраняет доверие к генератору случайных чисел и прошивке аппаратного кошелька. Air-gapped-подход также позволяет проверку в нескольких независимых инструментах, тогда как аппаратный кошелек является единой точкой доверия.
Сколько времени занимает весь air-gapped-процесс?
Для первой настройки закладывайте 2-4 часа, включая подготовку ОС, проверку, генерацию ключей и очистку. Последующие генерации на уже подготовленном устройстве занимают 30-60 минут.
Можно ли использовать смартфон как air-gapped-устройство?
Смартфоны сложно полностью изолировать, потому что у них несколько радиомодулей (сотовая связь, Wi-Fi, Bluetooth, NFC), которые не всегда можно физически отключить. Ноутбук с удаленным сетевым оборудованием надежнее. Некоторые специализированные устройства (например, Keystone wallet) изначально спроектированы как air-gapped-устройства для подписи.
Нужна ли air-gapped-генерация для каждого кошелька?
Нет. Для повседневных расходных кошельков с небольшими суммами достаточно надежного аппаратного кошелька или даже хорошо защищенного программного кошелька. Air-gapped-генерация рекомендуется для долгосрочного холодного хранения значительной стоимости.
Как обновлять ПО на air-gapped-машине?
Никак. Air-gapped-машина должна работать на одном и том же ПО неограниченно долго. Если нужна более новая версия инструмента генерации, скачайте и проверьте ее на онлайн-машине, перенесите через USB и проверьте checksum на air-gapped-машине перед использованием.
Что если генератор случайных чисел на air-gapped-машине неисправен?
Для этого и существует энтропия на костях как запасной вариант. Если вы не доверяете аппаратным и программным RNG, генерируйте энтропию вручную костями и передавайте ее в BIP-39 инструмент. Безопасность итоговой seed-фразы будет зависеть только от качества бросков костей, а не от электронных компонентов.
Может ли вредоносное ПО преодолеть air gap?
Теоретически сложные атакующие уровня государств демонстрировали техники преодоления air gap через электромагнитные излучения, акустические сигналы или мигание LED. На практике такие атаки требуют физической близости, специализированного оборудования и значительно превосходят возможности обычных криптоворов. Для подавляющего большинства пользователей корректно поддерживаемый air gap практически непробиваем.