Реализация PIN-кода для подтверждения транзакций мобильного криптокошелька

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация PIN-кода для подтверждения транзакций мобильного криптокошелька
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация PIN-кода для подтверждения транзакций мобильного криптокошелька

PIN-код — fallback к биометрии и самостоятельный механизм защиты транзакций. Главная ошибка реализации: хранить PIN в открытом виде или сравнивать его строковое представление без хэширования. Вторая по частоте — не ограничивать количество попыток.

Как хранить PIN правильно

PIN никогда не хранится как есть. Минимальный приемлемый вариант — PBKDF2-HMAC-SHA256 с уникальной солью (32 байта из CSPRNG) и количеством итераций от 100 000. Лучше — bcrypt или Argon2id, но последний требует стороннюю библиотеку на iOS.

На iOS: PBKDF2 через CCKeyDerivationPBKDF из CommonCrypto:

func deriveKey(from pin: String, salt: Data, iterations: UInt32 = 200_000) -> Data {
    var derivedKey = Data(count: 32)
    let pinData = pin.data(using: .utf8)!
    derivedKey.withUnsafeMutableBytes { derivedPtr in
        pinData.withUnsafeBytes { pinPtr in
            salt.withUnsafeBytes { saltPtr in
                CCKeyDerivationPBKDF(
                    CCPBKDFAlgorithm(kCCPBKDF2),
                    pinPtr.baseAddress, pinData.count,
                    saltPtr.baseAddress, salt.count,
                    CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
                    iterations,
                    derivedPtr.baseAddress, 32
                )
            }
        }
    }
    return derivedKey
}

Соль + хэш хранятся в Keychain с kSecAttrAccessibleWhenUnlockedThisDeviceOnly. PIN из памяти обнуляется сразу после деривации.

Ограничение попыток и блокировка

После 3 неудачных попыток — задержка (например, 30 секунд). После 5 — более долгая. После 10 — полная блокировка кошелька с требованием восстановления через seed-фразу. Счётчик попыток хранится в Keychain (не UserDefaults — его можно сбросить удалением данных приложения без root, а Keychain — нельзя).

Атаку через удаление и переустановку приложения можно частично нейтрализовать: на iOS Keychain с kSecAttrAccessibleWhenUnlockedThisDeviceOnly без kSecAttrSynchronizable переживает переустановку. На Android данные KeyStore при удалении приложения уничтожаются — там блокировку нужно хранить через EncryptedSharedPreferences в отдельном contentProvider или через бэкенд.

UI: кастомный numpad

Системная цифровая клавиатура удобна, но делает невозможным визуальный контроль — не понятно, сколько цифр введено. Кастомный numpad (6 кружков + 10 цифр + backspace) — стандарт для криптокошельков. Без haptic feedback на каждый тап — ощущение хуже.

PIN-поле никогда не должно предлагать автозаполнение из iCloud Keychain или менеджера паролей — textContentType = .none + autocorrectionType = .no + keyboardType = .numberPad на скрытом TextField под кастомным numpad.

Сроки — 1–3 дня. PBKDF2 + UI numpad + ограничение попыток — день-полтора. Добавление механизмов anti-bypass и тестирование граничных случаев — до трёх дней.