Обеспечение соответствия мобильного приложения требованиям HIPAA
HIPAA в мобильном приложении — это работа с Protected Health Information (PHI). Диагнозы, назначения, результаты анализов, история болезни — всё это PHI. Если приложение хранит, передаёт или отображает хотя бы один из 18 идентификаторов HIPAA (имя, дата рождения, адрес, номер телефона, email, номер страховки и др. в связке с медицинскими данными), оно попадает под действие закона как Business Associate или Covered Entity.
Технические safeguards — не опция
HIPAA Security Rule делит защитные меры на Administrative, Physical и Technical safeguards. Мобильная разработка отвечает за 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.







