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

Реализация PIN-кода для входа в мобильное приложение Представьте: пользователь вводит пароль каждый раз при открытии приложения. Раздражение, отток, падение конверсии на 30% — типичная картина. Альтернатива — PIN-код. Но просто сохранить четыре цифры в UserDefaults — катастрофа, чреватая утечкой

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

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

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

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

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

Часто задаваемые вопросы

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

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

Представьте: пользователь вводит пароль каждый раз при открытии приложения. Раздражение, отток, падение конверсии на 30% — типичная картина. Альтернатива — PIN-код. Но просто сохранить четыре цифры в UserDefaults — катастрофа, чреватая утечкой токенов. Мы уже сталкивались с проектами, где такой подход приводил к компрометации учётных записей. Наша команда (опыт 8+ лет, более 50 проектов с аутентификацией) реализует защищённую схему PIN-кода с нуля. Закажите реализацию под ключ — от криптографии до UI.

PIN-код — локальный второй фактор: пользователь один раз вводит полные учётные данные, затем разблокирует приложение PIN-кодом. Это не аутентификация на сервере — это разблокировка локального хранилища с credentials. Ключевое понятие: PIN нельзя хранить. Ни в какой форме. Даже хеш без соли — небезопасен: 4-6 цифр перебираются за секунды на современном GPU. Следуя рекомендациям Apple Security Guide, мы используем стойкие алгоритмы деривации.

Как реализовать правильную криптографическую схему?

PIN используется для деривации ключа, которым шифруется реальный секрет (refresh token или симметричный ключ шифрования данных). Схема:

  1. Генерируем случайный salt (16–32 байта, SecRandomCopyBytes / SecureRandom).
  2. Из PIN + salt выводим ключ через PBKDF2 (минимум 100 000 итераций, SHA-256) или Argon2id. PBKDF2 в 1000 раз медленнее простого хеша, что критично для защиты от перебора.
  3. Сгенерированным ключом шифруем refresh token (AES-256-GCM).
  4. Шифротекст + salt + IV сохраняем в Keychain / EncryptedSharedPreferences.
  5. PIN нигде не сохраняем.
// iOS — деривация ключа из PIN func deriveKey(from pin: String, salt: Data) throws -> SymmetricKey { let pinData = Data(pin.utf8) var derivedKey = Data(count: 32) let result = derivedKey.withUnsafeMutableBytes { derivedKeyPtr in pinData.withUnsafeBytes { pinPtr in salt.withUnsafeBytes { saltPtr in CCKeyDerivationPBKDF( CCPBKDFAlgorithm(kCCPBKDF2), pinPtr.baseAddress, pinData.count, saltPtr.baseAddress, salt.count, CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256), 100_000, derivedKeyPtr.baseAddress, 32 ) } } } guard result == kCCSuccess else { throw CryptoError.keyDerivationFailed } return SymmetricKey(data: derivedKey) } 

Верификация PIN при вводе: пробуем расшифровать AES-GCM с полученным ключом. Если расшифровка удалась (тег совпал) — PIN правильный. Если нет — неправильный. Никаких isPinCorrect флагов в хранилище.

Кастомная клавиатура: в 10 раз безопаснее системной

Системная клавиатура для PIN — плохая идея: iOS и Android показывают предиктивный ввод, PIN может попасть в словарь автокоррекции; фиксированный layout — нет рандомизации; третьи стороны теоретически могут перехватить ввод через InputMethodService. Поэтому делаем кастомную цифровую клавиатуру. В SwiftUI — LazyVGrid с кнопками, без UITextField. В Jetpack Compose — аналогично через LazyVerticalGrid. Отображение введённых цифр — заполненные/пустые круги, без текста. Рандомизация раскладки (shuffle digits) — опционально для high-security приложений. Усложняет shoulder surfing.

Как защититься от перебора PIN?

После N неудачных попыток (обычно 3–5) — lockout. Варианты:

Тип lockout Описание Время блокировки
Мягкий Пауза между попытками, растёт экспоненциально 30 с → 5 мин → 30 мин
Жёсткий Блокировка PIN-входа, требуется полный логин Бессрочно до ввода credentials
Очень жёсткий (enterprise) Стирание данных приложения после 10 неудачных попыток Немедленно

Счётчик ошибок хранится в Keychain / EncryptedSharedPreferences — не в UserDefaults, иначе пользователь может сбросить счётчик удалением/восстановлением приложения из бэкапа.

Смена PIN

Старый PIN → расшифровываем секрет → новый PIN → деривируем новый ключ → шифруем заново → сохраняем с новым salt и IV. Атомарно: сначала записываем новые данные во временный ключ, проверяем что расшифровка работает, только потом удаляем старые.

Биометрия + PIN

Биометрия — удобство, PIN — обязательный fallback. При lockout Face ID/Touch ID система требует пасскод устройства, а не PIN приложения. Это разные вещи. PIN приложения должен работать независимо от состояния системной биометрии.

Архитектурно: LocalAuthService с методом unlock(), который пробует биометрию и при отказе/недоступности переключается на PIN-экран. Решение о том, что показать первым, — конфигурация приложения или предпочтение пользователя.

Что входит в реализацию

Компонент Описание
Криптографическая схема PBKDF2/Argon2id + AES-256-GCM + соль+IV
Кастомная клавиатура Без предиктивного ввода, с рандомизацией (опционально)
Счётчик ошибок и lockout Экспоненциальная задержка или полная блокировка
Биометрический fallback Touch ID / Face ID / Fingerprint + PIN
Тестирование Unit-тесты криптографии, UI-тесты экранов
Документация Интеграционная документация для вашей команды
Дополнительные детали безопасности

Мы также проводим аудит криптографической схемы и кода клавиатуры, чтобы исключить side-channel атаки. Для финансовых приложений добавляем рандомизацию раскладки клавиш и защиту от recording.

Сроки

Реализация PIN с правильной криптографической схемой, кастомной клавиатурой, счётчиком ошибок и биометрическим fallback — 5–8 рабочих дней. Более сложные сценарии (рандомизация, enterprise-lockout) — до 2 недель.

Оцените ваш проект: свяжитесь с нами — мы подготовим предложение под ключ за 24 часа. В результате вы получите защищённый PIN-вход, соответствующий стандартам безопасности App Store и Google Play. Закажите реализацию и сократите расходы на поддержку безопасности.