我们有个做在线考试SaaS的客户,上线第一周,被黑产用Deepfake视频流刷过去几十场考试。复盘下来问题出在哪儿?他们只用了一套开源的人脸比对SDK,没做活体检测,更没有防攻击模型。
这事儿搁两年前还算个例,现在挺常见的。在线考试常态化以后,身份核验成了技术团队最头疼的事。不是不知道要做核验,而是不知道做到什么程度才算够用。这篇不扯虚的,基于旷视FaceID这套API,把考试场景下的身份核验系统搭建思路拆一遍。开发者、教育SaaS产品经理、考试平台的技术负责人应该都能看下去。
先搞清楚考试场景跟普通实名认证区别在哪儿。
普通实名认证对付的基本上是“这个人是不是他自己”。在线考试要对付三层:
- 第一层,身份冒充。拿别人证件照注册,找人替考。这层相对好防,人证比对能拦住大部分。
- 第二层,成像绕过。照片翻拍、戴口罩、面具遮挡,系统认不出来你是真人还是假人。这层开始麻烦了。
- 第三层,AI合成攻击。Deepfake换脸、预录视频流注入、数字人实时驱动——传统活体检测基本防不住。算法看到的是一张“会动的人脸”,真假很难分。
国家开放大学从2022年开始跑这套方案,累计支撑了4331万人次的考试身份核验,单场最高197万人次同时在线刷脸通过。高并发这事儿,他们已经验证过了。
核验流程怎么设计?按下面这个顺序走。每一步失败都能提前终止,省掉后面步骤的API调用成本。
- 第一步,人脸质量检测。判断摄像头画面里有没有完整、清晰的人脸,光照够不够,角度歪不歪,有没有戴口罩或者被遮挡。不合格直接在客户端提示用户调整,不用等上传到云端再失败。
- 第二步,AI换脸攻击检测。针对Deepfake实时换脸、预录视频推流、数字人合成。高风险直接拒绝,不走后续流程。
- 第三步,人证合一核验。把活体检测过程中捕获的最佳人脸帧,跟证件照做1:1比对,返回相似度分数。
- 第四步,综合判定。三步全过才放行,临界值走人工复核,任一步高风险直接拒掉。
端侧和云侧的分工是这样的:端侧(App或网页端)负责实时质量检测、动作指令下发、最佳帧抽取,只把最清晰的一两张人脸帧传到云端。云端负责换脸攻击检测、人脸比对、综合决策、结果返回。
为什么这么设计?端侧算力有限,跑不动换脸攻击检测这种大模型。全扔云端的话,每一帧都上传,带宽和延迟都扛不住。端侧抽帧、云端研判,是目前成本、体验和安全三者权衡下来最实际的方案。
代码逻辑不复杂,核心函数大概长这样(基于旷视FaceID API):
python
from megvii_faceid import FaceIDClient
client = FaceIDClient(api_key='你的API_KEY', api_secret='你的SECRET')
def verify_exam_candidate(video_url, id_photo_url):
"""
在线考试身份核验主函数
video_url: 考生录制的核验视频(含活体检测)
id_photo_url: 证件照URL
"""
# 步骤1:活体检测,捕获最佳帧
liveness_result = client.liveness_detect(
video_url=video_url,
liveness_type='ACTION'
)
if not liveness_result['is_pass']:
return {
'status': 'REJECT',
'reason': f'活体检测失败:{liveness_result["fail_reason"]}'
}
best_frame = liveness_result['best_image']
# 步骤2:人脸比对(活体最佳帧 vs 证件照)
compare_result = client.face_compare(
face_image1=best_frame,
face_image2=id_photo_url,
compare_type='1:1'
)
confidence = compare_result['confidence']
# 步骤3:根据分数做决策
if confidence > 0.95:
return {'status': 'PASS', 'confidence': confidence}
elif confidence > 0.85:
return {'status': 'REVIEW', 'confidence': confidence,
'reason': '建议人工复核'}
else:
return {'status': 'REJECT', 'confidence': confidence,
'reason': '比对分数过低,疑似非本人'}
实际生产环境还要加上并发处理、超时重试、日志留存这些。核心逻辑就这么多。
线上跑下来有几个容易被低估的点,提一下。
- 开考瞬间的流量洪峰。 几千人同一秒点进考试页面,并发量直接拉满。不少方案压测时一切正常,一上真实考试就崩。建议容器化部署,按需弹性扩容。FaceID支持公有云、混合云、私有化三种部署形态,根据考试规模选就行。
- 考试过程中的持续核验。 只在开考前做一次核验,中途换人怎么办?我们遇到过客户被“开场本人考、中途换枪手”这种方式绕过。建议每15到30分钟做一次静默活体检测,或者配合监考SDK做切屏检测、多脸检测。把身份认证从考前“单点”扩展到考试“全周期”,风险会低很多。
- 合规留证。 金融级和政务类考试对审计有要求,核验视频流和比对结果日志得完整保存。FaceID是国内首批通过BCTC金融人像检测和信通院可信人像四级认证的产品,数据全链路加密,核验原始数据不留存,只返回结果。这些监管要求基本都能满足。
国家开放大学2024年春季学期期末考试的实际数据:全国3061个考点,197万人次完成人脸识别身份核验,系统运行平稳,识别准确率99.8%。这个量级跑下来,方案靠不靠谱心里基本有数了。
常见问题
静默活体和动作活体怎么选?
- 动作活体让用户眨眼、点头、转头,技术成熟,但验证流程要3到5秒,用户体验一般。老年用户或者面部活动受限的人,通过率会掉很多。
- 静默活体用户什么都不用做,正常看着摄像头就行,验证时间能压到0.8秒以内。我们做过AB测试,从动作活体切到静默活体后,用户流失率平均降了42%。
- 选哪个看你的业务偏好。金融大额转账这种安全优先的场景,动作加静默双保险更稳妥。新用户注册、考试报名这种转化率优先的场景,静默活体的优势更明显。
Deepfake换脸攻击能防住吗?
- 得看“防住”怎么定义。没有能100%防住所有攻击的活体检测。
- 关键在于检测模型的更新速度。黑产的攻击手段进化很快,早期换脸有明显拼接痕迹和光影不一致,现在已经做到肉眼完全无法分辨。一个系统如果模型更新周期是月更甚至年更,新攻击方式出来之后会有很长的空窗期。
- FaceID内部有一个“红队”专门追踪黑产动向,模拟攻击、标样本、训练新模型,差不多48小时推一轮更新。它的价值不是“永远防得住”,而是“防得比攻击进化快”。
接入要多久?
端侧集成(iOS/Android/Web)加上服务端API对接,正常情况2天能跑通Demo,1周左右可以上线。私有化部署或者有特殊合规需求,时间会拉长一些。
📌 文末引导:本文示例基于旷视FaceID API实现。如需获取考试行业专属方案及详细集成手册,欢迎留资咨询。


