Забезпечення HIPAA-комплайансу мобільного додатку
HIPAA у мобільному додатку — це робота з Protected Health Information (PHI). Діагнози, призначення, результати аналізів, історія хвороб — все це PHI. Якщо додаток зберігає, передає або відображає навіть один з 18 ідентифікаторів HIPAA (ім'я, дата народження, адреса, номер телефону, email, номер страхування, поєднаних з медичними даними), він потрапляє під дію закону як Business Associate або Covered Entity.
Технічні гарантії — не опція
HIPAA Security Rule ділить захисні заходи на Administrative, Physical та Technical гарантії. Мобільна розробка відповідає за Technical. Ключові вимоги:
Шифрування PHI у спокої (at rest)
На Android PHI не можна зберігати в простому SharedPreferences або незашифрованій SQLite. Мінімум — EncryptedSharedPreferences через AndroidX Security:
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.setUserAuthenticationRequired(true) // вимагає біометрії/PIN для доступу
.setUserAuthenticationParameters(300, KeyProperties.AUTH_BIOMETRIC_STRONG)
.build()
val encryptedPrefs = EncryptedSharedPreferences.create(
context,
"phi_secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
Для бази даних — SQLCipher або Room з шифруванням через SupportSQLiteOpenHelper. На iOS — Core Data з NSPersistentStoreDescription та NSFileProtectionComplete:
let storeDescription = NSPersistentStoreDescription(url: storeURL)
storeDescription.setOption(FileProtectionType.complete as NSObject,
forKey: NSPersistentStoreFileProtectionKey)
FileProtectionType.complete означає: дані недоступні, поки пристрій заблокований. Навіть при фізичному доступі до пристрою.
Шифрування при передачі (in transit)
TLS 1.2 — абсолютний мінімум. Рекомендується TLS 1.3. Certificate pinning обов'язковий для PHI endpoints — перехват трафіку через корпоративний proxy або MITM-атака не мають давати доступ до медданих.
// OkHttp certificate pinning
val client = OkHttpClient.Builder()
.certificatePinner(
CertificatePinner.Builder()
.add("api.healthapp.example.com",
"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build()
)
.build()
Пін оновлюється за 30+ днів до ротації сертифіката — інакше всі користувачі отримають SSLPeerUnverifiedException та додаток впаде.
Автоматичний вихід з сеансу (Automatic Logoff)
HIPAA вимагає автоматичного завершення сеансу після періоду неактивності. Для медичних додатків типовий таймаут — 5–15 хвилин. Реалізація через AppStateMonitor:
class SessionTimeoutManager {
private var lastActivityTime = Date()
private let timeoutInterval: TimeInterval = 10 * 60 // 10 хвилин
func recordActivity() {
lastActivityTime = Date()
}
func checkTimeout() {
if Date().timeIntervalSince(lastActivityTime) > timeoutInterval {
// Блокуємо додаток, вимагаємо повторної аутентифікації
authManager.lockSession()
// PHI не має бути видна у App Switcher
obscureScreenForAppSwitcher()
}
}
}
Важливо з iOS: при переході у фон скриншот екрана зберігається для App Switcher. Якщо на екрані PHI — замінити його на заглушку в applicationWillResignActive.
Аудит доступу до PHI
Кожен доступ до PHI має логуватися. Це не опція — це HIPAA Audit Control requirement. Мінімальний набір для кожної події:
- User ID та роль
- Timestamp з точністю до секунди
- Тип операції (view, create, update, delete, export)
- Ідентифікатор пацієнта (не ім'я — ID)
- Ідентифікатор ресурсу (запис, документ)
- IP адреса або Device ID
Логи зберігаються 6 років (HIPAA retention). Їх нельзя видаляти або змінювати — append-only storage.
Backup та Recovery
Дані PHI мають бути доступні навіть після збою. Вимоги: резервне копіювання, тестування відновлення, документально Recovery Time Objective (RTO) та Recovery Point Objective (RPO). Для мобільних додатків це стосується серверної частини, але мобільний клієнт не повинен бути єдиним сховищем PHI.
Business Associate Agreement
Якщо додаток використовує хмарні сервіси для обробки PHI — AWS, Google Cloud, Azure, Firebase — з кожним повинен бути підписаний BAA (Business Associate Agreement). AWS та Google Cloud надають BAA, але тільки для певних сервісів. Firebase Crashlytics, наприклад, не покривається BAA Google Cloud — нельзя включати в Crashlytics дані, які можуть бути PHI (user ID, який можна пов'язати з медданими — вже потенційно PHI).
Типові помилки при розробці
- Логування PHI у Crashlytics без анонімізації
- Push-сповіщення з текстом діагнозу — нарушення, навіть якщо пристрій тільки користувача
- Синхронізація через iCloud Drive без шифрування
- Debug build з відключеним certificate pinning, випадково потрапив у production
- Відсутність
FLAG_SECUREна екранах з PHI — дані видні у App Switcher
Терміни
| Задача | Срок |
|---|---|
| Аудит поточного додатку + gap analysis | 3–5 днів |
| Шифрування at rest + в transit | 3–5 днів |
| Session timeout + екрани блокування | 2–3 дні |
| Audit logging з retention | 3–4 дні |
| BAA зі всіма субпроцессорами + документація | 3–7 днів |
| Повний HIPAA compliance | 4–8 тижнів |
Стоимость рассчитывается індивідуально після аудиту архітектури та складу PHI.







