Реализация безопасного хранения ключей в Secure Enclave (iOS) для криптокошелька

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация безопасного хранения ключей в Secure Enclave (iOS) для криптокошелька
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация безопасного хранения ключей в Secure Enclave (iOS) для криптокошелька

Secure Enclave — отдельный процессор внутри Apple SoC, изолированный от основного CPU и RAM. Приватный ключ, сгенерированный в Secure Enclave, физически не покидает чип — даже у вашего кода нет к нему прямого доступа. Операция подписи выполняется внутри SE и наружу возвращается только результат.

Ограничения, которые нужно знать до начала

Secure Enclave поддерживает только P-256 (secp256r1, он же NIST P-256). Это не secp256k1, которую используют Bitcoin и Ethereum. Поэтому SE не подходит для хранения ETH/BTC приватных ключей напрямую. Типичное использование для крипто-кошелька — хранить в SE ключ шифрования, которым зашифрован secp256k1 приватный ключ в Keychain. Или использовать SE для биометрической защиты Keychain-записи через SecAccessControlCreateWithFlags.

Если ваше приложение работает с блокчейнами, использующими P-256 (например, некоторые enterprise-цепочки или NEAR protocol через ed25519 — не путать), SE можно использовать для прямого хранения и подписи.

Создание ключа в Secure Enclave

let accessControl = SecAccessControlCreateWithFlags(
    nil,
    kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
    [.privateKeyUsage, .biometryCurrentSet],
    nil
)!

let attributes: [String: Any] = [
    kSecAttrKeyType as String:        kSecAttrKeyTypeECSECPrimeRandom,
    kSecAttrKeySizeInBits as String:  256,
    kSecAttrTokenID as String:        kSecAttrTokenIDSecureEnclave,
    kSecPrivateKeyAttrs as String: [
        kSecAttrIsPermanent as String:    true,
        kSecAttrApplicationLabel as String: "wallet-signing-key-v1",
        kSecAttrAccessControl as String:  accessControl
    ]
]

var error: Unmanaged<CFError>?
guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
    throw error!.takeRetainedValue()
}

kSecAttrTokenIDSecureEnclave — это и есть указание системе создать ключ в SE. biometryCurrentSet инвалидирует ключ при изменении биометрии (добавление нового отпечатка или смена Face ID). Для кошелька это правильное поведение — нужна явная переаутентификация.

Подпись данных через SE-ключ

let publicKey = SecKeyCopyPublicKey(privateKey)!
let algorithm: SecKeyAlgorithm = .ecdsaSignatureMessageX962SHA256

guard SecKeyIsAlgorithmSupported(privateKey, .sign, algorithm) else {
    throw WalletError.algorithmNotSupported
}

var signError: Unmanaged<CFError>?
guard let signature = SecKeyCreateSignature(
    privateKey,
    algorithm,
    dataToSign as CFData,
    &signError
) else {
    throw signError!.takeRetainedValue()
}

Подпись выполняется асинхронно с точки зрения UI — пока SE обрабатывает запрос (и если нужна биометрия — пока пользователь аутентифицируется), main thread не блокируется. Весь вызов нужно вынести в Task или dispatch queue.

Схема для ETH/BTC кошельков

Раз SE не работает с secp256k1 напрямую, используем следующую схему:

  1. Генерируем ephemeral P-256 ключ в SE — это «ключ шифрования».
  2. Генерируем secp256k1 приватный ключ в памяти.
  3. Шифруем secp256k1 ключ через ECIES с публичным ключом SE: SecKeyCreateEncryptedData с алгоритмом eciesEncryptionStandardX963SHA256AESGCM.
  4. Зашифрованный blob сохраняем в Keychain с kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
  5. При подписи транзакции: расшифровываем через SE (что требует биометрию), используем secp256k1 ключ для подписи, сразу обнуляем из памяти.

Это дороже одного Keychain-хранения по сложности, но ключ никогда не живёт на диске в открытом виде.

Процесс

Аудит требований (P-256 напрямую или схема шифрования для secp256k1), реализация, тестирование на реальном железе — симулятор не поддерживает Secure Enclave. Отдельно тестируем поведение при смене биометрии, при удалении и переустановке приложения.

Сроки — 3–5 дней. Симулятор для большей части разработки достаточен, но финальное тестирование только на устройстве.