Перейти к основному содержимому
БиометрияMar 28, 2026

Построение систем биометрической верификации: архитектурные паттерны для новых требований Индонезии

OS
Open Soft Team

Engineering Team

Обзор архитектуры системы: краткий ответ

Совместимая система биометрической верификации для мандата на SIM-карты в Индонезии требует четырёх основных компонентов: биометрический захват (камера + SDK), обработка живости (PAD на устройстве или серверная), сопоставление личности (верификация 1:1 с базой IKD) и безопасное хранение (зашифрованные шаблоны с журналом аудита). Система должна обслуживать население свыше 270 миллионов человек, обрабатывать верификации за менее чем 3 секунды и соответствовать как Регламенту KOMDIGI № 7/2026, так и требованиям UU PDP по защите данных.

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

Основные компоненты

1. Подсистема биометрического захвата

Подсистема захвата отвечает за получение качественного изображения лица пользователя. Качество напрямую влияет на точность последующих этапов — плохо освещённое, размытое изображение приведёт к отказу верификации даже для легитимного пользователя.

Требования:

  • Минимальное разрешение изображения: 640x480 пикселей (VGA) для области лица
  • Детекция лица: необходимо определить лицо в кадре и обрезать до стандартизированного размера
  • Оценка качества: оценка освещения, угла позы, перекрытий и размытия перед продолжением
  • Формат изображения: JPEG с качеством 80%+ или PNG для захвата без потерь
  • Метаданные: временная метка захвата (ISO 8601), идентификатор устройства, GPS-координаты (с согласия пользователя), параметры камеры

Пороги качества (соответствие ISO/IEC 19794-5):

ПараметрДопустимый диапазон
Угол рыскания-15° до +15°
Угол тангажа-10° до +10°
Угол крена-8° до +8°
Расстояние между глазами≥ 90 пикселей
Освещение100-250 люкс на лице
Размытие (дисперсия Лапласиана)> 100
Доля площади лица> 20% кадра

2. Подсистема обработки живости

Подсистема живости определяет, получен ли захваченный биометрический образец от живого человека. Для мандата Индонезии она должна соответствовать стандартам ISO/IEC 30107-3 Уровень 2.

Архитектурное решение: Edge vs Сервер

Для индонезийского рынка рекомендуется гибридный подход:

  • На устройстве (edge): запуск облегчённой модели живости (MobileFaceNet или аналог, <30 МБ) для немедленной обратной связи. Это отсекает 90%+ базовых атак с печатью и экраном.
  • Серверная: запуск полной ансамблевой модели для окончательного скоринга живости. Это отсекает изощрённые атаки, включая 3D-маски и инъекции дипфейков.

Двухуровневый подход обеспечивает быструю обратную связь (менее 500 мс на устройстве) при поддержании высокой безопасности (серверная часть перехватывает то, что пропускает edge).

3. Биометрический движок сопоставления

Движок сопоставления сравнивает извлечённый лицевой шаблон с эталонным шаблоном в базе IKD. Для мандата на SIM это всегда верификация 1:1 (не идентификация 1:N).

Конвейер сопоставления:

  1. Предобработка: нормализация выравнивания лица, обрезка, изменение размера до входных размеров модели (112x112 или 160x160)
  2. Извлечение признаков: прогон через глубокую нейросеть (ArcFace, CosFace или аналог) для получения 128-512-мерного вектора эмбеддинга
  3. Сравнение: расчёт косинусного сходства или L2-расстояния между зондовым и эталонным эмбеддингами
  4. Решение: применение порога — обычно 0,4-0,6 косинусного сходства в зависимости от модели и требуемого FAR

Требования к производительности:

МетрикаТребование
Время верификации 1:1< 200 мс (серверная)
Пропускная способность> 1 000 верификаций/сек на узел
FAR (коэффициент ложного принятия)< 0,001%
FRR (коэффициент ложного отклонения)< 5%
Размер шаблона< 2 КБ

4. Подсистема безопасного хранения и аудита

Все биометрические данные должны храниться и передаваться в соответствии с требованиями UU PDP и KOMDIGI:

  • Шифрование шаблонов: AES-256-GCM для шаблонов в состоянии покоя
  • Управление ключами: аппаратный модуль безопасности (HSM) или облачный KMS для ключей шифрования
  • Передача: TLS 1.3 с привязкой сертификатов для всех биометрических данных в транзите
  • Журналы аудита: неизменяемый, только для добавления журнал всех событий верификации
  • Жизненный цикл данных: шаблоны хранятся только на время верификации; логи — 5 лет

Соответствие требованиям Индонезии: UU PDP

Закон о защите персональных данных Индонезии (UU PDP, Закон № 27 от 2022 года) классифицирует биометрические данные как специфические персональные данные (data pribadi yang bersifat spesifik), требующие усиленной защиты:

Обязанности контролёра данных

ОбязанностьРеализация
Правовое основаниеЯвное согласие + нормативное соответствие (мандат KOMDIGI)
Ограничение целиБиометрические данные используются исключительно для верификации регистрации SIM
Минимизация данныхХранение шаблонов, а не необработанных изображений; удаление снимков после обработки
ТочностьОбеспечение актуальности шаблонов; повторная верификация каждые 5 лет
Ограничение храненияЛоги: 5 лет; Шаблоны: срок действия SIM + 1 год
Целостность и конфиденциальностьШифрование AES-256, контроль доступа, уведомление о нарушениях в течение 72 часов
ПодотчётностьВедение записей обработки, проведение DPIA, назначение DPO

Трансграничная передача данных

UU PDP запрещает передачу специфических персональных данных (включая биометрию) за пределы Индонезии, за исключением случаев:

  1. Страна назначения имеет эквивалентные законы о защите данных (KOMDIGI ведёт список одобренных стран)
  2. Действуют обязательные корпоративные правила
  3. Получено явное согласие субъекта данных

Практическое следствие: вся инфраструктура обработки биометрии должна размещаться в индонезийских дата-центрах. Облачные провайдеры должны предлагать развёртывание в регионе Джакарта (AWS ap-southeast-3, GCP asia-southeast2, Azure Southeast Asia).

Масштабируемость: обслуживание 270+ млн населения

Индонезия имеет 275,5 миллионов жителей (оценка переписи 2025) и 345+ миллионов активных SIM-карт. Система биометрической верификации должна масштабироваться для обработки:

  • Пиковые новые регистрации: 500 000 в день в период начального развёртывания
  • Волна повторной верификации: 200+ миллионов существующих SIM должны быть повторно верифицированы до июля 2027
  • Устойчивое состояние: 50 000-100 000 верификаций в день для новых SIM и замен

Архитектура горизонтального масштабирования

                    [Балансировщик нагрузки]
                    /      |      \
                   /       |       \
            [Узел 1]  [Узел 2]  [Узел N]
            (Rust)    (Rust)    (Rust)
               |         |         |
               +----+----+----+----+
                    |         |
              [PostgreSQL]  [Redis-кэш]
              (Основной +    (Кэш шаблонов,
               Реплики)      лимитирование,
                              сессии)
                    |
              [Шлюз IKD]
              (Лимитированный,
               circuit-breaker)

Планирование ёмкости

КомпонентСпецификацияОбоснование
API-узлы8-16 экземпляров (4 vCPU, 16 ГБ RAM)1 000 верификаций/сек/узел
PostgreSQLОсновной + 2 реплики чтения (8 vCPU, 64 ГБ RAM)Запись логов аудита + чтение шаблонов
RedisКластер из 3 узлов (4 vCPU, 32 ГБ RAM)Кэширование шаблонов, лимитирование
Объектное хранилищеS3-совместимое (мин. 10 ТБ)Зашифрованные снимки при обработке
HSM2 экземпляра (active-passive)Управление ключами шифрования
Сеть1 Гбит/с выделенная, <10 мс до IKDТребование верификации в реальном времени

Сравнение: обработка Edge vs Cloud

ФакторEdge (на устройстве)Cloud (серверная)Рекомендация
Задержка<500 мс1-3 с (зависит от сети)Edge для UX
Точность92-95% (ограниченная модель)98-99,5% (полная модель)Cloud для решений
БезопасностьУязвимость к вмешательству в SDKПолный контроль обработкиCloud для соответствия
Пропускная способностьМинимальная (только результат)100-500 КБ за верификациюEdge для сельских районов
СтоимостьНулевая маржинальная стоимость$0,01-0,05 за верификациюEdge при масштабе
Совместимость устройствТребуется SDK для каждой платформыЛюбое устройство с камеройCloud для универсальности
Цикл обновленияОбзор App Store (1-7 дней)Мгновенное серверное развёртываниеCloud для гибкости
Офлайн-возможностиДа (только живость)НетEdge для пробелов связи

Рекомендуемый гибридный подход для Индонезии:

  1. Edge: валидация качества захвата + пассивная проверка живости (немедленная обратная связь)
  2. Cloud: активная валидация живости + извлечение шаблона + верификация IKD (авторитетное решение)

Безопасность: защита шаблонов и шифрование

Защита биометрических шаблонов

Необработанные биометрические шаблоны чувствительны — в случае кражи их нельзя заменить, как пароли. Реализуйте отменяемую биометрию с использованием необратимых преобразований:

use aes_gcm::{Aes256Gcm, KeyInit, Nonce};
use aes_gcm::aead::Aead;
use rand::RngCore;

/// Шифрование биометрического шаблона для хранения
fn encrypt_template(
    template: &[f32],
    key: &[u8; 32],
) -> Result<EncryptedTemplate, CryptoError> {
    let cipher = Aes256Gcm::new_from_slice(key)
        .map_err(|_| CryptoError::InvalidKey)?;

    // Генерация случайного nonce (96 бит для GCM)
    let mut nonce_bytes = [0u8; 12];
    rand::thread_rng().fill_bytes(&mut nonce_bytes);
    let nonce = Nonce::from_slice(&nonce_bytes);

    // Сериализация шаблона в байты
    let template_bytes: Vec<u8> = template
        .iter()
        .flat_map(|f| f.to_le_bytes())
        .collect();

    // Шифрование AES-256-GCM (обеспечивает аутентичность + конфиденциальность)
    let ciphertext = cipher
        .encrypt(nonce, template_bytes.as_ref())
        .map_err(|_| CryptoError::EncryptionFailed)?;

    Ok(EncryptedTemplate {
        nonce: nonce_bytes.to_vec(),
        ciphertext,
        algorithm: "AES-256-GCM".to_string(),
        created_at: chrono::Utc::now(),
    })
}

Полный конвейер верификации на Rust

use axum::{extract::State, Json};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use chrono::Utc;

#[derive(Deserialize)]
struct VerificationRequest {
    nik: String,
    facial_image_base64: String,
    device_id: String,
    liveness_score: f64,
    capture_metadata: CaptureMetadata,
}

#[derive(Serialize)]
struct VerificationResponse {
    transaction_id: Uuid,
    verified: bool,
    confidence: f64,
    processing_time_ms: u64,
    timestamp: chrono::DateTime<Utc>,
}

async fn verify_biometric(
    State(state): State<AppState>,
    Json(req): Json<VerificationRequest>,
) -> Result<Json<VerificationResponse>, AppError> {
    let start = std::time::Instant::now();
    let transaction_id = Uuid::new_v4();

    // Шаг 1: Валидация формата NIK (16 цифр)
    if !is_valid_nik(&req.nik) {
        return Err(AppError::InvalidNik);
    }

    // Шаг 2: Декодирование и валидация изображения
    let image_bytes = base64::decode(&req.facial_image_base64)
        .map_err(|_| AppError::InvalidImage)?;
    let quality = assess_image_quality(&image_bytes)?;
    if quality.score < 0.7 {
        return Err(AppError::InsufficientImageQuality(quality));
    }

    // Шаг 3: Серверная валидация живости
    let liveness = state.liveness_engine
        .validate(&image_bytes)
        .await?;
    if liveness.score < 0.95 || liveness.is_attack {
        return Err(AppError::LivenessCheckFailed);
    }

    // Шаг 4: Извлечение биометрического шаблона
    let template = state.biometric_engine
        .extract_template(&image_bytes)
        .await?;

    // Шаг 5: Верификация через IKD (с circuit breaker)
    let ikd_result = state.ikd_circuit_breaker
        .call(state.ikd_client.verify(
            &req.nik, &template
        ))
        .await?;

    // Шаг 6: Запись журнала аудита
    let elapsed = start.elapsed().as_millis() as u64;
    state.audit_logger.log_verification(
        transaction_id, &req.nik,
        ikd_result.verified, ikd_result.confidence,
        elapsed, &req.capture_metadata,
    ).await?;

    // Шаг 7: Безопасное удаление необработанного изображения
    drop(image_bytes);

    Ok(Json(VerificationResponse {
        transaction_id,
        verified: ikd_result.confidence >= 0.95,
        confidence: ikd_result.confidence,
        processing_time_ms: elapsed,
        timestamp: Utc::now(),
    }))
}

Мониторинг и наблюдаемость

Производственная биометрическая система должна иметь всеобъемлющий мониторинг:

МетрикаПорог оповещенияНазначение
Успешность верификации< 90%Обнаружение проблем системы или волн атак
Среднее время обработки> 3 секундСоответствие SLA
Частота отклонений живости> 15%Обнаружение кампаний атак или проблем SDK
Задержка шлюза IKD> 2 секундДеградация инфраструктуры
Состояние circuit breaker IKDOpenНемедленное реагирование
Ошибки шифрования шаблонов> 0Проблемы HSM или управления ключами
Ошибки записи журнала аудита> 0Риск несоответствия

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

Какие языки программирования лучше всего подходят для систем биометрической верификации?

Rust — отличный выбор для основного конвейера верификации благодаря гарантиям безопасности памяти, абстракциям нулевой стоимости и высокой производительности. Биометрический движок сопоставления выигрывает от способности Rust выполнять SIMD-оптимизированные векторные операции без пауз сборщика мусора. Python остаётся доминирующим для обучения ML-моделей и прототипирования. Для мобильного SDK требуются Kotlin (Android) и Swift (iOS), с C/C++ для кросс-платформенного биометрического ядра.

Как справиться с масштабом 270+ млн населения в базе сопоставления?

Поскольку мандат на SIM в Индонезии использует верификацию 1:1 (не идентификацию 1:N), масштаб базы управляем. Каждый запрос верификации ищет один NIK и сравнивает с одним хранимым шаблоном. Узким местом является не размер базы, а параллельная пропускная способность. При правильном индексировании поля NIK PostgreSQL обрабатывает 10 000+ поисков в секунду на скромном оборудовании.

В чём разница между AES-256-GCM и AES-256-CBC для шифрования шаблонов?

AES-256-GCM настоятельно рекомендуется вместо CBC, поскольку обеспечивает конфиденциальность и аутентичность в одной операции (аутентифицированное шифрование с ассоциированными данными). GCM обнаруживает подделку шифротекста, а CBC — нет, что делает CBC уязвимым для атак padding oracle. GCM также быстрее на современных CPU с поддержкой инструкций AES-NI. Техническая спецификация KOMDIGI предписывает аутентифицированное шифрование, что делает GCM естественным выбором.

Может ли биометрическая верификация работать с существующей инфраструктурой e-KTP?

e-KTP (электронное удостоверение личности) содержит чип с биометрическими данными (отпечатки пальцев и фотография лица). Однако мандат на SIM специально использует цифровую платформу IKD, а не считывание с физических чипов e-KTP. IKD предоставляет централизованную, актуальную базу данных, доступную через API, тогда как считывание чипов e-KTP требует NFC-оборудования и непрактично для высоконагруженных регистраций SIM.

Какова рекомендуемая стратегия аварийного восстановления?

Реализуйте мультирегиональную active-passive конфигурацию в пределах Индонезии: основная площадка в Джакарте (AWS ap-southeast-3 или локальный дата-центр) с резервной в Сурабае или Батаме. Используйте потоковую репликацию PostgreSQL с RPO менее 1 минуты и RTO менее 15 минут. Ключи HSM должны быть реплицированы на площадку DR.

Как обеспечить справедливость и предотвратить предвзятость в распознавании лиц?

Тестирование на предвзятость критически важно для разнообразного населения Индонезии. Тестируйте систему по типам кожи Фитцпатрика III-VI, обоим полам, всем возрастным группам (18-80+) и с обычными аксессуарами (хиджаб, очки, маски). Процесс сертификации KOMDIGI включает тестирование демографического паритета — система должна обеспечивать отклонение точности не более 2% между демографическими группами.

Что происходит при утечке биометрических данных?

По UU PDP утечка с биометрическими данными требует: уведомление органа по защите данных в течение 72 часов, уведомление затронутых лиц без неоправданной задержки и подробный отчёт об инциденте. Скомпрометированные шаблоны должны быть отозваны и перезарегистрированы — вот почему отменяемая биометрия (необратимые преобразования шаблонов) критически важна. При надлежащей защите шаблонов утечка приводит к отзыву шаблонов, а не к постоянной компрометации личности.