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

Одна з частих вразливостей мобільних криптогаманців — зберігання PIN-коду в UserDefaults або у вигляді звичайного рядка. Ми бачили проєкти, де PIN порівнювався через `==` з числом, отриманим із SharedPreferences. Це прямий шлях до крадіжки коштів. Без обмеження спроб зловмисник може перебрати всі

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
PIN-код для підтвердження транзакцій криптогаманця
Простий
від 1 дня до 3 днів

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

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    898
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    784
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1219
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1081
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1004
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    600

Одна з частих вразливостей мобільних криптогаманців — зберігання PIN-коду в UserDefaults або у вигляді звичайного рядка. Ми бачили проєкти, де PIN порівнювався через == з числом, отриманим із SharedPreferences. Це прямий шлях до крадіжки коштів.

Без обмеження спроб зловмисник може перебрати всі 10000 комбінацій за пару годин на сучасному смартфоні. Результат — втрата контролю над гаманцем. Ми вирішуємо це завдання за 1–3 дні на будь-якому стеку.

За 5 років ми впровадили PIN-захист у 15+ криптогаманцях, щоразу адаптуючи під вимоги App Store Review і Google Play. У цій статті розберемо, як правильно хешувати PIN, організувати блокування та зробити кастомний numpad, який не дасть витоку через автозаповнення. Якщо ви хочете уникнути аудиту безпеки з high-критичними знахідками, впровадження під ключ — ваш варіант. Ми пропонуємо готове рішення з вихідним кодом та документацією. Зв'яжіться з нами — і за 2 дні отримаєте захищений PIN-ввід. Гарантуємо сумісність з iOS 15+ і Android 8+.

Проблеми, які вирішуємо

  • Зберігання PIN без хешу. Часто розробники використовують MD5 або навіть plaintext. Це перша ж знахідка при пентесті.
  • Відсутність блокування. Без затримок і повного блокування зловмисник перебирає PIN за хвилини.
  • Системна клавіатура. Вона не дає візуального контролю введення і може пропонувати автозаповнення з iCloud Keychain — ризик витоку 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 } 

Сіль + хеш зберігаються в iOS Keychain з kSecAttrAccessibleWhenUnlockedThisDeviceOnly. PIN з пам'яті обнуляється відразу після деривації.

Порівняння: PBKDF2 з 200 000 ітерацій в 10 000 разів повільніший за звичайний SHA256, що робить атаку перебором неефективною.

"Елементи Keychain зберігаються після видалення додатку при використанні типу доступності kSecAttrAccessibleWhenUnlockedThisDeviceOnly." — Apple Keychain Documentation.

Поетапне керівництво реалізації

  1. Генерація солі (32 байти, CSPRNG).
  2. Хешування PIN через PBKDF2 (200 000 ітерацій).
  3. Збереження хешу та солі в Keychain / EncryptedSharedPreferences.
  4. Налаштування лічильника спроб (зберігати там же).
  5. Розробка кастомного numpad з візуальним зворотним зв'язком.
  6. Опціонально: інтеграція з біометрією (Face ID / Touch ID).
  7. Тестування граничних випадків: перевстановлення, скидання даних, багатопотокове введення.

Чому потрібно обмежувати спроби введення

Без обмеження зловмисник може перебирати PIN нескінченно. Після 3 невдалих спроб — затримка 30 секунд. Після 5 — хвилина. Після 10 — повне блокування гаманця з вимогою відновлення через seed-фразу. Лічильник спроб зберігається в Keychain (не UserDefaults — його можна скинути видаленням даних додатку без root).

Атаку через видалення та перевстановлення додатку частково нейтралізуємо: на iOS Keychain з kSecAttrAccessibleWhenUnlockedThisDeviceOnly переживає перевстановлення. На Android — блокування зберігаємо через EncryptedSharedPreferences в окремому contentProvider або бекенд.

Кастомний numpad чи системна клавіатура: що безпечніше

Системна цифрова клавіатура зручна, але не дає візуального контролю — не видно, скільки цифр введено. Кастомний numpad (6 кружечків + 10 цифр + backspace) — стандарт для криптогаманців. Він виключає автозаповнення (textContentType = .none), запобігаючи витоку PIN через менеджери паролів.

Платформа Сховище Поведінка при перевстановленні
iOS Keychain з kSecAttrAccessibleWhenUnlockedThisDeviceOnly Дані зберігаються
Android KeyStore / EncryptedSharedPreferences KeyStore знищується, потрібен бекенд

Порівняння методів хешування

Метод Ітерацій Безпека Швидкість (відн.)
PBKDF2-HMAC-SHA256 100k–200k Добра 1x
bcrypt cost=10 Краще 0.5x
Argon2id m=19MB, t=2, p=1 Найкраща 0.2x

Процес роботи

  1. Аналіз вимог та аудит поточної реалізації безпеки.
  2. Проектування схеми: хешування, блокування, numpad.
  3. Реалізація на Swift / Kotlin / Flutter.
  4. Тестування на вразливості (перебір, скидання лічильника, перевстановлення).
  5. Деплой та документація.

Терміни та вартість

Терміни: 1–3 дні. Вартість розробки — від $270–390. Економія від запобігання витоку даних — до $9k–13k. (вартість інциденту при крадіжці коштів).

Замовте розробку під ключ — отримайте готовий код, захищений від перебору та витоків. Зв'яжіться з нами для консультації.