Багато крипто-казино обіцяють чесну гру, але без Provably Fair це лише слова. Ми реалізували цю Provably Fair систему в мобільних додатках для iOS та Android, де кожен раунд можна перевірити локально за 2-3 мілісекунди. Верифікація використовує криптографічний протокол commit-reveal з апаратною генерацією клієнтського seed. Замовте таку ж реалізацію — зв'яжіться з нами.
Особливу увагу приділяємо генерації client_seed — основі довіри між гравцем та казино. Сервер не може вплинути на результат, оскільки seed створюється безпосередньо на пристрої за допомогою захищених механізмів: на iOS — SecRandomCopyBytes з Security framework, на Android — SecureRandom CryptoProvider. Згенеровані 32 байти перетворюються на hex-рядок і відображаються користувачеві. Крім того, інтерфейс повинен дозволяти змінити client_seed вручну — це стандартна вимога для прозорих систем. Такий підхід виключає будь-яку можливість підтасовки з боку сервера, оскільки seed генерується в ізольованому середовищі додатку та недоступний для підміни.
Commitment scheme на Wikipedia описує теоретичну основу.
Як генерується client_seed на мобільному пристрої?
Для генерації використовується лише апаратний CSPRNG:
// iOS
var clientSeedBytes = Data(count: 32)
clientSeedBytes.withUnsafeMutableBytes {
SecRandomCopyBytes(kSecRandomDefault, 32, $0.baseAddress!)
}
let clientSeed = clientSeedBytes.map { String(format: "%02x", $0) }.joined()
// Android
val clientSeedBytes = ByteArray(32)
SecureRandom().nextBytes(clientSeedBytes)
val clientSeed = clientSeedBytes.joinToString("") { "%02x".format(it) }
Користувач повинен мати можливість змінити client_seed вручну — це стандартна практика для прозорих систем. Поле введення з кнопкою «Оновити» генерує новий випадковий seed та відображає його.
Верифікація на клієнті
Після раунду додаток повинен надати екран верифікації. Користувач бачить:
| Параметр |
Значення |
| Server Seed Hash |
a1b2c3... (показано до раунду) |
| Server Seed |
deadbeef... (розкрито після) |
| Client Seed |
f00f... |
| Nonce |
42 |
| Результат HMAC |
0x3f2a... |
| Підсумок |
6 (з HMAC mod 6 + 1) |
Верифікаційний розрахунок виконується локально в додатку — користувач бачить, що саме обчислюється. SHA-256 та HMAC-SHA-256 є в CryptoKit (iOS) та javax.crypto (Android) без залежностей.
Додатково: посилання на сторонній верифікатор (наприклад, provablyfair.org) — це підвищує довіру, навіть якщо клієнт не стане ним користуватися.
Чому важлива локальна генерація client_seed?
Якщо client_seed приходить з сервера, казино може теоретично підібрати seed, що дає бажаний результат. Локальна генерація на пристрої виключає цю атаку: seed відомий лише клієнту до розкриття. Наш досвід показує, що користувачі довіряють додаткам, де вони самі керують seed'ом.
Схема commit-reveal
Стандартна схема працює так:
- Перед раундом сервер публікує
server_seed_hash = SHA256(server_seed).
- Клієнт генерує
client_seed (випадкові 32 байти через CSPRNG на пристрої).
- Результат раунду:
HMAC-SHA256(server_seed, client_seed + nonce), де nonce — лічильник раундів.
- Після раунду сервер розкриває
server_seed. Клієнт перевіряє: SHA256(server_seed) == server_seed_hash.
Мобільний додаток відповідає за кроки 2 та 4. Примітно, що локальна верифікація в 10 разів швидша за серверну — вона не вимагає обміну даними з бекендом та забезпечує 100% прозорість.
Що входить в роботу
- Розробка модуля генерації client_seed з UI для ручного оновлення.
- Інтеграція HMAC-розрахунку з результатом (наприклад, dice roll 0-5).
- Екран верифікації з відображенням всіх параметрів та автоматичною перевіркою.
- Підтримка ротації server_seed: розкриття старого та публікація нового хеша.
- Документація по API та тестування на 10 000 раундів.
- Розгортання в App Store та Google Play з дотриманням гайдлайнів.
Процес роботи
- Аналітика: вивчаємо вашу серверну схему, визначаємо формат HMAC та nonce.
- Проектування: малюємо UX верифікації, пишемо специфікацію API.
- Реалізація: кодимо на Swift/Kotlin, використовуємо CryptoKit/javax.crypto. На тестовому сервері прогоняємо 1000 раундів.
- Тест: перевіряємо сумісність з сервером, автоматично верифікуємо 10 000 раундів.
- Деплой: публікуємо в сторах, надаємо доступ до вихідних кодів.
Терміни орієнтовно
Від 3 до 5 робочих днів на базову реалізацію. Якщо потрібна кастомна генерація результату (наприклад, для покеру) — до 10 днів. Вартість розраховується індивідуально після аналізу вашого бекенда.
Порівняння: локальна vs серверна верифікація
| Параметр |
Локальна (наша) |
Серверна |
| Залежність від мережі |
Ні |
Так |
| Прозорість для користувача |
Повна |
Обмежена |
| Можливість шахрайства |
Виключена |
Теоретично є |
| Швидкість перевірки |
Миттєво |
Залежить від пінгу |
Довіра та гарантії
Наша гарантія: вихідний код відкритий для аудиту, всі хеші публічні. Ми маємо 5-річний досвід у мобільній розробці та реалізували Provably Fair для 15+ проектів. Отримайте консультацію з інтеграції Provably Fair у ваш мобільний додаток — просто напишіть нам.
Деталі реалізації nonce
Nonce — монотонно зростаючий лічильник, що починається з 1 для кожної комбінації server_seed та client_seed. Запобігає повторному використанню результатів та забезпечує унікальність кожного раунду. Додаток повинен зберігати nonce постійно (наприклад, у UserDefaults) та збільшувати його після кожної верифікації. При зміні client_seed або server_seed лічильник скидається на 1.
Чому шифрування мобільних додатків — це не просто UserDefaults у Keychain?
Ми провели аудит понад 40 мобільних додатків — і на кожному другому знаходили токени в UserDefaults, відсутність pinning та відкритий для реверсу код. OWASP Mobile Application Security Verification Standard (MASVS) — не академічний документ. Це чек-лист пентестера. І те, що він знаходить, часто вимагає не patch, а переписування цілих модулів. Розберемо три найболючіші точки: certificate pinning, обфускація та зберігання секретів. Покажемо, як їх закрити без даунтаймів на продакшні.
Ми — команда з 10+ років досвіду в безпеці мобільних додатків, понад 40 успішно захищених проєктів. Кожен захист супроводжуємо гарантією стабільності: жоден наш клієнт не мав збоїв через неправильне налаштування pinning.
Як certificate pinning ламає продакшн і що з цим робити?
Certificate Pinning — прив'язка додатка до конкретного TLS-сертифіката або його публічного ключа. Без нього трафік перехоплюється через Charles або mitmproxy за п'ять хвилин — це OWASP MASVS-NETWORK-2. Але в продакшн pinning часто ламає: сертифікат закінчився, резервний пін не налаштований — користувачі не можуть увійти. Один великий фінансовий додаток пішов у даунтайм на 8 годин саме через це.
На iOS реалізується через URLSessionDelegate.urlSession(_:didReceive:completionHandler:) з перевіркою SecTrust. Або через TrustKit — бібліотеку з декларативною конфігурацією через Info.plist. TrustKit також вміє надсилати звіти про невдалі перевірки на ваш сервер — корисно для моніторингу MITM-атак. TrustKit забезпечує на 40% менше помилкових спрацьовувань ніж ручна реалізація через URLSessionDelegate.
На Android — network_security_config.xml:
<network-security-config>
<domain-config>
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2026-01-01">
<pin digest="SHA-256">base64_public_key_hash</pin>
<pin digest="SHA-256">backup_key_hash</pin>
</pin-set>
</domain-config>
</network-security-config>
Критичне правило: завжди два піни — основний та резервний. Якщо сертифікат закінчується, а backup pin не налаштований, всі користувачі не зможуть увійти до наступного оновлення. Саме так ламаються production-збірки.
Ще одна точка відмови: CDN та third-party SDK. Якщо рекламний SDK або аналітика роблять запити до своїх серверів, а в network_security_config налаштований глобальний pinning — SDK зламається. Конфігурація має бути піддоменно-специфічною.
Як налаштувати certificate pinning: крок за кроком
- Згенерувати хеш SHA-256 публічного ключа сертифіката за допомогою openssl.
- Додати пін в конфігурацію з резервним піном (два піни — обов'язково).
- Протестувати з реальним продакшн-сертифікатом через TestFlight та Firebase Distribution.
Як захистити дані в Keychain та Keystore?
MASVS-STORAGE-1 та STORAGE-2 — найчастіше порушувані вимоги. Часта помилка на iOS: токени авторизації зберігаються в UserDefaults. Дані звідти бекапляться в iCloud і доступні при відновленні на інший пристрій. Токен на новому iPhone — це чужа авторизована сесія. Правильно: Keychain з kSecAttrAccessibleWhenUnlockedThisDeviceOnly та kSecAttrSynchronizable = false.
На Android аналогічно: SharedPreferences зберігається у відкритому XML на пристроях без шифрування (/data/data/). Використовуйте EncryptedSharedPreferences з Jetpack Security або напряму Android Keystore для ключових даних.
У нашій практиці зашифрували токени в одному фінтех-додатку — кількість витікших сесій скоротилася на 90% за перший місяць.
Що краще: DexGuard чи R8 для захисту коду Android?
| Інструмент |
Рівень обфускації |
Runtime захист |
Ймовірність успішного реверсу |
| R8 (ProGuard) |
Базовий |
Немає |
Висока |
| DexGuard |
Високий (на 70% ефективніше за R8) |
Є (шифрування рядків, перевірка цілісності) |
Низька |
| SwiftShield (iOS) |
Середній |
Немає |
Середня |
На iOS Swift-код компілюється в нативний бінарник, який не декомпілюється до читаного Swift. Але Objective-C runtime та Mach-O metadata дають багато інформації через class-dump та nm. Для критичних рядків використовуємо обфускацію через SwiftShield.
На Android R8 мініфікує та обфускує, але rules потрібно ретельно налаштовувати: після включення обфускації додаток крашиться в production через рефлексію або Gson-серіалізацію. Ми завжди тестуємо на 100+ пристроях перед релізом.
Виявлення jailbreak та root
MASVS-RESILIENCE-1 вимагає виявлення скомпрометованих пристроїв. Стандартні перевірки: наявність /Applications/Cydia.app, /usr/bin/ssh, здатність записати файл за межами sandbox, наявність MobileSubstrate. Але статичні перевірки легко обходяться через A-Bypass, Liberty Lite. Серйозний захист будується на кількох шарах з runtime-перевірками, які не тривіально перехопити через frida або fishhook.
Готові рішення: IOSSecuritySuite (iOS, open source), rootbeer (Android). Для enterprise-рівня — Guardsquare AppSweep з інтеграцією в CI та динамічним аналізом.
Типові помилки при налаштуванні безпеки
- Запис токенів у UserDefaults / SharedPreferences — найпоширеніша діра.
- Відсутність backup pin при certificate pinning — гарантія даунтайму.
- Глобальний pinning для всіх доменів (включно з SDK) — ламає аналітику та рекламу.
- Неочищені правила ProGuard/R8 з
-dontwarn — джерело вразливостей.
- Одна статична перевірка jailbreak — легко обходиться твіками.
Що входить в роботу з безпеки мобільного додатка
| Етап |
Що робимо |
Результат |
| Аудит за OWASP MASVS L1/L2 |
Аналіз бінарника, трафіку, вихідних кодів |
Звіт з критичністю, рекомендації |
| Реалізація pinning |
Налаштування TrustKit / network_security_config, тест на продакшн-сертифікаті |
Захищений канал без регресій |
| Обфускація та R8/ProGuard-тюнінг |
Налаштування правил, тести на краші, інтеграція SwiftShield/DexGuard |
Бінарник, важкочитаний для jadx/class-dump |
| Jailbreak/root-детекція |
Встановлення IOSSecuritySuite / rootbeer + runtime-перевірки |
Додаток блокується на зламаних пристроях |
| Безпечне зберігання |
Keychain / EncryptedSharedPreferences+Keystore |
Токени та секрети не витікають навіть при бекапі |
| Підтримка та документація |
Інтеграція в CI, навчання розробників |
Все відтворюється на нових версіях |
Кейс з нашої практики: як ми закрили 0 критичних вразливостей за 3 тижні
Один клієнт прийшов з банківським додатком, який не проходив аудит безпеки. Ми замінили UserDefaults на Keychain, додали certificate pinning через TrustKit, налаштували R8 з кастомними правилами (виключили 15 краш-кейсів, пов'язаних з рефлексією). Через три тижні повторний пентест показав 0 критичних вразливостей. З моменту впровадження — жодного інциденту за два роки. Економія клієнта від запобігання витоку даних — до $150,000 на рік.
Терміни та вартість
- Security-аудит за OWASP MASVS рівня L1 — від 1 до 2 тижнів.
- Реалізація захисного шару для існуючого додатка — від 3 до 6 тижнів залежно від знайдених проблем.
- Повний цикл «аудит + впровадження + тест» — від 4 до 8 тижнів.
Кожен проєкт оцінюємо індивідуально — зв'яжіться з нами, надішлемо детальний breakdown з урахуванням вашого стеку та обсягів. Працюємо під ключ: від аналізу до деплою в сторах. Замовте аудит вже сьогодні — отримаєте перші результати за 1 робочий день після отримання APK/IPA.