Реалізація експорту приватного ключа з мобільного криптокошелька
Експорт приватного ключа — операція з максимальним threat level. Ключ з'являється на екрані в откритому вигляді та вразлив для скриншотів, screen recording, shoulder surfing поки не натиснули "приховати". Завдання — мінімізувати час експозиції та кількість шляхів, через які проходить ключ.
Захист перед показом
Біометрична аутентифікація або PIN-код обов'язкові перед будь-яким показом ключа. Недостатньо просто перевірити "користувач залогінен" — потрібна саме challenge-at-point-of-action аутентифікація.
iOS — LAContext.evaluatePolicy(.deviceOwnerAuthentication). Android — BiometricPrompt з BIOMETRIC_STRONG. Ключ з Keychain/Keystore запитується тільки після успішної аутентифікації, не до.
Флаг preventScreenCapture / FLAG_SECURE:
// iOS — у viewWillAppear
UIScreen.main.value(forKey: "disableScreenCapture") // deprecated
// правильно:
func screenCaptureBlocking() {
let field = UITextField()
field.isSecureTextEntry = true
if let layer = field.layer.sublayers?.first {
view.layer.addSublayer(layer)
layer.frame = view.bounds
}
}
На iOS немає публічного API для блокування скриншотів, але трюк з UITextField.isSecureTextEntry працює на iOS 13–17. Android WindowManager.LayoutParams.FLAG_SECURE блокує й скриншоти, й screen recording.
Показ та формат
Ключ показується в monospace шрифті, розбитий на групи по 4 символи для читаємості. QR-код — зручний спосіб передачі, але QR повинен рендеритися тільки в пам'яті та ніколи не зберігатися в фото-бібліотеку.
Таймер автоскриття — 60 секунд. Після закінчення ключ замінюється на ••••••••••••. Повторний показ — знову біометрія.
Clipboard — обережно
Кнопка "Скопіювати" зручна, але clipboard на Android до версії 10 доступен будь-якій програмі в фоні без дозволів. Либо не надавайте копіювання для приватного ключа, либо — копіюйте та автоматично чистіть через 30 секунд з повідомленням користувачу.
Що тестуємо
Експорт → імпорт того ж ключа в інший кошелек (MetaMask, Trust Wallet) з перевіркою збігу адреси. Поведінка при відклонені біометрії. Відсутність ключа у логах — NSLog, print, Android Log.d у production build не повинні захоплювати sensitive data. Перевіряється grep'ом у CI по паттернах privateKey, mnemonic, secret.
Часова шкала — 1–3 дня. Якщо потрібна підтримка кількох форматів (hex, WIF, Base58) та QR — ближче до трьох.







