Перейти к основному содержимому

Офлайн-генерация ключей: руководство по безопасности 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-скрипты для генерации ключей.

Шаги настройки:

  1. Скачайте Tails ISO на обычном компьютере.
  2. Проверьте подпись ISO с помощью ключа подписи Tails.
  3. Запишите ISO на USB-накопитель через Tails Installer, Etcher или dd.
  4. Загрузите air-gapped-компьютер с USB.
  5. В Tails Greeter не настраивайте сетевое подключение.
  6. Убедитесь, что сетевые интерфейсы не активны: ip link show должен показывать все интерфейсы в состоянии DOWN.

Ubuntu Live USB (альтернатива)​

Если Tails не подходит:

  1. Скачайте Ubuntu ISO и проверьте его checksum.
  2. Запишите на USB.
  3. Загрузитесь с отключенной сетью в BIOS.
  4. В установщике Ubuntu выберите «Try Ubuntu» (не устанавливайте).
  5. Убедитесь в отсутствии сетевого подключения.

Проверка целостности 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

SafeSeed Seed Phrase Generator и Paper Wallet Creator можно сохранить для офлайн-использования. Перед переходом в офлайн сохраните страницу целиком (Ctrl+S / Cmd+S), перенесите ее на air-gapped-компьютер через USB и откройте в браузере. Все криптографические операции выполняются локально в JavaScript — связь с сервером не требуется.

Шаги:

  1. На обычном (онлайн) компьютере перейдите к инструменту SafeSeed.
  2. Сохраните страницу целиком на USB-накопитель.
  3. Проверьте целостность файла (сравните checksum, если доступны).
  4. Перенесите USB-накопитель на air-gapped-компьютер.
  5. Откройте сохраненный HTML-файл в браузере.
  6. Сгенерируйте seed-фразу.
  7. Запишите ее на бумаге (не сохраняйте в цифровом виде на air-gapped-машине).
  8. Проверьте seed-фразу: введите ее повторно и убедитесь, что генерируются те же адреса.

Метод 2: использование BIP-39 инструмента Ian Coleman​

BIP-39 инструмент Ian Coleman — open-source автономная HTML-страница, широко используемая для офлайн-генерации ключей:

  1. Скачайте последний релиз с GitHub на онлайн-компьютере.
  2. Проверьте PGP-подпись.
  3. Перенесите на air-gapped-компьютер через USB.
  4. Откройте bip39-standalone.html в браузере.
  5. Сгенерируйте или введите мнемонику.
  6. Выберите монету и путь деривации.
  7. Запишите seed-фразу и адреса.

Метод 3: энтропия на основе игральных костей​

Для максимального недоверия ко всем программным RNG можно генерировать энтропию вручную с помощью костей:

  1. Используйте кости казино-класса (точные кости с острыми гранями, а не округленные потребительские).
  2. Бросьте одну кость 99 раз для 256 бит энтропии (каждый бросок дает ~2.585 бита; 99 бросков дают ~255.9 бита).
  3. Преобразуйте результаты бросков в бинарную строку.
  4. Используйте BIP-39 инструмент (офлайн), чтобы преобразовать бинарную энтропию в мнемонику.
  5. Либо бросьте кость 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. Тест малой транзакцией​

Перед хранением значительной суммы:

  1. Отправьте небольшое количество криптовалюты на первый receiving-адрес.
  2. На отдельном устройстве восстановите кошелек из seed-фразы.
  3. Убедитесь, что средства видны и вы можете подписать транзакцию для отправки обратно.

Это подтверждает всю цепочку: генерацию энтропии, кодирование мнемоники, деривацию 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-компьютер полезен не только для генерации ключей, но и для постоянной подписи транзакций:

Рабочий процесс​

  1. Онлайн-машина (watch-only): создайте неподписанную транзакцию.
  2. Передача: перенесите неподписанную транзакцию на air-gapped-машину через USB или QR-код.
  3. Air-gapped-машина: подпишите транзакцию приватным ключом.
  4. Передача: перенесите подписанную транзакцию обратно на онлайн-машину.
  5. Онлайн-машина: отправьте подписанную транзакцию в сеть.

Передача через 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:

  1. Сгенерируйте три отдельные seed-фразы в трех отдельных air-gapped-сессиях (в идеале на разных устройствах).
  2. Настройте 2-of-3 multi-signature-кошелек.
  3. Храните каждую seed-фразу в отдельной физической локации.
  4. Транзакции требуют подписи на двух из трех 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 практически непробиваем.

Связанные руководства​