Реализация импорта приватного ключа в мобильный криптокошелёк
Импорт приватного ключа — операция, которую пользователь выполняет один раз, но которая должна быть реализована безупречно. Ключ передаётся в hex, Base58 или WIF, проходит через UI и должен оседать в Secure Storage. В этом процессе чаще всего допускают ошибки с валидацией формата, утечкой через clipboard и незанулённой памятью. Потеря средств из-за такой ошибки может составлять миллионы рублей — поэтому безопасность здесь критична. Мы разрабатываем импорт под ключ с учётом всех security best practices. Наш опыт — 7+ лет в мобильной разработке, реализовали импорт ключей для 15+ проектов.
Проблемы, которые решаем
Ошибки валидации — ключ вне допустимого диапазона (например, равен нулю или превышает порядок группы secp256k1) может привести к генерации неверного адреса или потере средств. Clipboard — если не очищать буфер обмена, ключ остаётся доступным другим приложениям, включая malware, которое может прочитать его в фоне. Память — приватный ключ не должен висеть в RAM дольше необходимого; его нужно обнулить сразу после использования. Также важно учитывать различия форматов: Ethereum использует 32-байтный hex, Bitcoin — WIF с Base58Check, Solana — чистый Base58. Для валидации используем библиотеку secp256k1, которая корректно проверяет диапазон ключа и принадлежность кривой. Обработка clipboard в SwiftUI на 30% быстрее, чем в UIKit, благодаря встроенному onChange.
Почему важно чистить clipboard?
После копирования ключа из буфера через paste необходимо немедленно обнулить UITextField и очистить глобальный clipboard. В SwiftUI это делается так:
.onChange(of: keyInput) { value in guard value.count >= 64 else { return } processImport(value) keyInput = "" // очищаем поле UIPasteboard.general.string = "" // чистим clipboard } На Android — clipboardManager.setPrimaryClip(ClipData.newPlainText("", "")). Без этого ключ остаётся в системном буфере и может быть прочитан любым приложением. Поэтому очистка обязательна, особенно на устройствах с malware-сканнерами.
Как обеспечить безопасное хранение?
После валидации ключ должен сразу попасть в Keychain (iOS) или EncryptedSharedPreferences/Keystore (Android). Паттерн с defer и обнулением буфера:
func importPrivateKey(_ hexKey: String) throws -> String { let keyData = try validateAndDecodeHex(hexKey) defer { keyData.withUnsafeMutableBytes { $0.baseAddress?.initializeMemory(as: UInt8.self, repeating: 0, count: keyData.count) } } let address = try deriveAddress(from: keyData) try keychain.store(keyData, identifier: "pk_\(address)") return address } На Android — Arrays.fill(keyBytes, 0) в блоке finally. Никогда не сохраняйте ключ в UserDefaults. Сравнение форматов ключей
| Блокчейн | Формат | Длина (байт) | Checksum | Диапазон валидности |
|---|---|---|---|---|
| Ethereum | hex (0x...) | 32 | Нет | 1 … secp256k1.order |
| Bitcoin | WIF (Base58Check) | 32 + 1 сжатие | Да (4 байта) | 1 … secp256k1.order |
| Solana | Base58 | 32 | Нет | 1 … Ed25519.order |
Сравнение методов хранения приватных ключей
| Метод | Платформа | Безопасность | Производительность |
|---|---|---|---|
| Keychain | iOS | Высокая (аппаратное шифрование) | Быстрый доступ |
| EncryptedSharedPreferences | Android | Средняя (AES-256) | Средняя |
| Android Keystore | Android | Высокая (TEE) | Медленнее, но безопаснее |
Keychain на iOS обеспечивает аппаратное шифрование и защиту от дампа памяти, что делает его лучшим выбором для хранения ключей. Android Keystore, хотя и медленнее, использует Trusted Execution Environment для изоляции ключей.
Какие форматы ключей поддерживаются?
Мы поддерживаем все основные форматы: hex (Ethereum, а также Bitcoin при конвертации), WIF (Bitcoin) с проверкой контрольной суммы, и чистый Base58 (Solana). Для каждого формата реализована отдельная валидация длины и диапазона. Возможна поддержка BIP38 (зашифрованный паролем ключ) по запросу. Также обрабатываются случаи с пробелами, лишними символами и смешанным регистром.
Типичные ошибки при импорте
- Отсутствие проверки на нулевой ключ (ключ равен 0) — приводит к генерации неверного адреса.
- Игнорирование префикса 0x в hex — библиотека может не распознать ключ.
- Хранение ключа в UserDefaults после импорта — данные остаются незащищёнными.
- Неочищенный clipboard после вставки — ключ доступен другим приложениям.
- Использование устаревших библиотек для деривации адреса — возможны уязвимости.
Процесс реализации
- Анализ — определяем список поддерживаемых блокчейнов, форматы ключей, требования к хранению.
- Проектирование — UI/UX безопасного ввода, выбор библиотек (noble/secp256k1, WalletCore, Web3.swift).
- Реализация — валидаторы для каждого формата, деривация адреса, интеграция с Secure Storage.
- Тестирование — граничные случаи (нулевой ключ, ошибочная checksum, ввод с пробелами, paste из сторонних приложений).
- Деплой — сборка, подпись, публикация в App Store / Google Play.
Что входит в работу
- Исходный код модуля импорта под iOS (Swift 5.9+) и Android (Kotlin, Jetpack Compose).
- Документация по форматам и интеграции.
- Тесты на граничные значения.
- Консультация по настройке Keychain/Keystore.
- Поддержка в течение 30 дней после сдачи.
Ориентировочные сроки
Реализация занимает от 1 до 3 дней в зависимости от количества блокчейнов. Стоимость рассчитывается индивидуально на основе объёма работ. Получите консультацию — оценим ваш проект бесплатно.
Свяжитесь с нами, чтобы обсудить требования к импорту приватного ключа. Закажите реализацию импорта — гарантируем безопасную интеграцию с учётом App Store Review Guidelines и Google Play политик.







