跳到主要内容
BiometricsMar 28, 2026

活体检测与印度尼西亚数字身份:防欺诈技术方法

OS
Open Soft Team

Engineering Team

什么是活体检测,印度尼西亚为何需要它?

活体检测是一种确定生物识别样本(如面部图像)是否来自真实、亲身在场的人而非欺骗工具(如打印照片、屏幕重放、硅胶面具或深度伪造视频)的技术。在印度尼西亚KOMDIGI 2026年第7号法规的背景下,活体检测是所有生物识别SIM卡验证系统的强制组件

风险极为重大。据国家网络和密码局(BSSN)的数据,印度尼西亚在2025年因网络犯罪损失约7万亿印尼盾(4.07亿美元)。仅SIM卡交换欺诈就造成了**1.2万亿印尼盾(7000万美元)**的损失。如果没有强大的活体检测,生物识别验证系统只是安全表演——攻击者可以展示受害者的高分辨率照片或视频来通过面部识别检查。

威胁格局:呈现攻击

针对面部识别系统的呈现攻击(也称为欺骗攻击)分为几个类别,每个类别需要不同的检测策略:

第1级:打印攻击

最简单的攻击使用目标人物的打印照片。对于缺乏活体检测的基本面部识别系统,这种方法令人惊讶地有效。攻击者在光面纸上打印高分辨率照片并举在相机前。

检测方法:

  • 纹理分析(检测打印图案、莫尔效应)
  • 边缘检测(纸张边缘在帧中可见)
  • 反射分析(纸张反射光线不同于皮肤)
  • 运动分析(2D表面的运动模式与3D面部不同)

第2级:屏幕重放攻击

攻击者在手机、平板或笔记本屏幕上显示目标的视频。这比打印攻击更复杂,因为它可以模拟眨眼和头部运动等面部动作。

检测方法:

  • 屏幕检测(识别像素网格模式、屏幕边框)
  • 莫尔图案分析(屏幕显示的像素会产生干涉图案)
  • 闪光反射测试(使用设备闪光灯检测屏幕反射的均匀性)
  • 光流分析(屏幕上的视频具有不同的光学特征)

第3级:3D面具攻击

最复杂的攻击使用3D打印或硅胶面具复制目标的面部。这些面具可能包括逼真的皮肤纹理、眼洞和嘴部开口。

检测方法:

  • 深度传感(使用结构光或ToF传感器检测平坦区域)
  • 皮肤光谱分析(真实皮肤在近红外光谱中具有独特的反射特征)
  • 微运动分析(微表情和脉搏导致的微小皮肤运动在面具中不存在)
  • 温度检测(需要热像仪——面具温度与面部不同)

第4级:深度伪造和数字注入

最先进的攻击使用AI生成的深度伪造视频或直接将合成帧注入相机管道。攻击者可能劫持相机驱动程序或使用虚拟相机软件。

检测方法:

  • 设备完整性检查(验证相机硬件未被篡改)
  • 注入检测(检测虚拟相机驱动程序或帧注入)
  • GAN伪影分析(深度伪造通常在边缘、头发和牙齿处有伪影)
  • 挑战-响应测试(要求用户执行随机动作序列,实时深度伪造难以准确复现)

ISO/IEC 30107-3:呈现攻击检测标准

ISO/IEC 30107-3是评估生物识别系统的呈现攻击检测(PAD)能力的国际标准。KOMDIGI法规要求所有生物识别SDK提供商通过2级或更高级别的PAD测试。

该标准定义了两个关键指标:

  • APCER(攻击呈现分类错误率): 攻击被错误接受为真实的百分比
  • BPCER(正常呈现分类错误率): 真实用户被错误拒绝为攻击的百分比
PAD级别APCER要求攻击类型
1级≤ 5%打印照片、屏幕重放
2级≤ 2.5%1级 + 纸面具、2D弯曲攻击
3级≤ 1%2级 + 3D面具、局部攻击

对于印度尼西亚的SIM卡验证,2级合规是最低要求。金融服务(经OJK监管)可能需要3级合规以提供更高级别的安全保障。

活体检测技术架构

被动活体检测 vs 主动活体检测

活体检测的两种主要方法各有优缺点:

被动活体检测在用户不知情的情况下分析单张图像或短视频来判断真伪。用户体验流畅——只需看镜头即可。

  • 优点:用户体验佳、速度快、无障碍
  • 缺点:对高级攻击的抵抗力较弱

主动活体检测要求用户执行特定动作(如转头、眨眼、微笑)以证明其为真人。

  • 优点:对欺骗攻击抵抗力更强
  • 缺点:用户体验较差、对残障人士可能有障碍、耗时更长

推荐混合方法

对于印度尼西亚的SIM卡验证场景,我们推荐一种混合方法,结合两种技术的优势:

  1. 初始被动检查:采集时运行被动活体检测(<500ms)
  2. 风险评分:如果被动检测的置信度低于阈值(如<0.85),触发主动挑战
  3. 主动挑战:要求用户执行一个简单的随机动作(如向左转头)
  4. 最终判定:综合被动和主动得分作出最终决定

Rust中的活体检测管道

use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct LivenessResult {
    pub is_live: bool,
    pub confidence: f64,
    pub method: LivenessMethod,
    pub attack_scores: AttackScores,
}

#[derive(Debug, Serialize, Deserialize)]
pub enum LivenessMethod {
    Passive,
    Active,
    Hybrid,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct AttackScores {
    pub print_attack: f64,
    pub screen_replay: f64,
    pub mask_3d: f64,
    pub deepfake: f64,
}

pub struct LivenessDetector {
    passive_model: OnnxModel,
    active_model: OnnxModel,
    threshold_passive: f64,
    threshold_active: f64,
}

impl LivenessDetector {
    pub async fn check_passive(
        &self,
        frame: &CaptureFrame,
    ) -> Result<LivenessResult, LivenessError> {
        let features = self.passive_model
            .extract_features(&frame.image_data)?;

        let scores = AttackScores {
            print_attack: features[0] as f64,
            screen_replay: features[1] as f64,
            mask_3d: features[2] as f64,
            deepfake: features[3] as f64,
        };

        let max_attack = scores.print_attack
            .max(scores.screen_replay)
            .max(scores.mask_3d)
            .max(scores.deepfake);

        Ok(LivenessResult {
            is_live: max_attack < self.threshold_passive,
            confidence: 1.0 - max_attack,
            method: LivenessMethod::Passive,
            attack_scores: scores,
        })
    }

    pub async fn check_hybrid(
        &self,
        frames: &[CaptureFrame],
        challenge: &Challenge,
    ) -> Result<LivenessResult, LivenessError> {
        // 1. 先进行被动检查
        let passive = self.check_passive(&frames[0]).await?;

        if passive.confidence >= 0.95 {
            return Ok(passive);
        }

        // 2. 被动得分不够高时使用主动检查
        let active_features = self.active_model
            .analyze_sequence(frames, challenge)?;

        let combined_confidence =
            passive.confidence * 0.4 + active_features.confidence * 0.6;

        Ok(LivenessResult {
            is_live: combined_confidence >= self.threshold_active,
            confidence: combined_confidence,
            method: LivenessMethod::Hybrid,
            attack_scores: passive.attack_scores,
        })
    }
}

模型部署与优化

在印度尼西亚部署活体检测需要考虑几个实际因素:

设备多样性

印度尼西亚拥有极其多样化的智能手机生态系统。在3.45亿张活跃SIM卡中,大量设备是低端至中端Android手机。您的活体检测解决方案必须在以下设备上可靠运行:

  • 低端设备:2GB RAM、四核处理器、VGA前置摄像头
  • 中端设备:4-6GB RAM、八核处理器、8MP前置摄像头
  • 高端设备:8GB+ RAM、旗舰处理器、支持深度传感的前置摄像头

模型大小与推理时间

部署方式模型大小推理时间准确率
设备端(TensorFlow Lite)5-15 MB50-200ms92-96%
设备端(ONNX Runtime)10-25 MB30-150ms93-97%
服务器端(TensorRT)50-200 MB10-50ms97-99%
混合10 MB(设备端)+ 100 MB(服务器端)100-250ms总计96-99%

网络条件

印度尼西亚的网络条件差异很大。在雅加达和泗水等主要城市,4G覆盖良好,平均延迟为30-50毫秒。但在农村地区,网络可能为3G甚至2G,延迟为200-500毫秒,丢包率为5-10%。

您的活体检测架构必须优雅地处理这些条件:

  • 设备端进行初步活体检查以减少网络依赖
  • 压缩生物识别模板以最小化传输大小(目标<50KB)
  • 实现带指数退避的重试逻辑
  • 为无网络场景提供离线排队机制

常见问题

活体检测可以被绕过吗?

没有活体检测系统是完美的。最先进的攻击(特别是第4级数字注入攻击)可能绕过当前技术。这就是为什么多层方法至关重要——结合被动检测、主动挑战、设备完整性检查和行为分析。安全目标不是实现100%的防护,而是使攻击成本足够高以阻止大多数攻击者。

活体检测系统的准确率如何?

现代活体检测系统在标准条件下可以实现97-99%的准确率。然而,准确率受光照条件、摄像头质量和用户配合度的影响。KOMDIGI法规要求95%的最低准确率,并留有5%的误拒绝率(FRR)余量。

如何选择活体检测SDK?

选择SDK时应考虑:KOMDIGI认证状态、ISO/IEC 30107-3合规级别、设备兼容性范围、离线能力、SDK大小对应用体积的影响、定价模型以及技术支持质量。建议在选择前使用自己的数据集对候选SDK进行基准测试。