---
id: 009
title: 实名认证（二代身份证 OCR + 人脸比对）
status: closed
labels: [compliance, p0, security]
assignee: team-lead
created_at: 2026-04-23
closed_at: 2026-04-23
---

# #009 实名认证

## 背景

中国相亲 / 社交类 App 2019 年网信办《互联网个人信息保护》《未成年人保护》等法规要求**强制实名**。不做实名：
- 应用商店（App Store / 国内安卓市场）无法上架
- 被举报后可能被下架 / 约谈
- 用户匿名注册 → 诈骗 / 骚扰高发

当前 xiangqin：只手机号注册，无身份核验。

## 方案

三段式核验：

### 1. 二代身份证 OCR
- 用户上传身份证正反面图片
- 云厂商 OCR API 识别姓名 + 身份证号 + 有效期
- 候选：阿里云身份证 OCR、腾讯云 OCR、百度 AI

### 2. 二要素 / 三要素核验
- 姓名 + 身份证号 → 公安数据库核验
- 三要素 = + 手机号（已注册绑定的）
- 阿里云 / 腾讯云实人认证 API

### 3. 活体 + 人脸比对
- 前端要求用户短视频 / 眨眼活体
- 服务端活体验证 + 人脸和身份证照片比对
- 阿里云 / 腾讯云人脸核身 API

## 存储

- 身份证图片：OSS **加密存储**（KMS）+ **不进 db**
- 身份证号：db 字段但 **HMAC-SHA256 hash**（类似手机号处理）
- 姓名：明文存（脱敏展示："张\*\*"）
- 核验结果 + 时间戳：db `users.verified_at` `users.verification_method`

## 成本

阿里云实人认证 ~¥0.3-0.5 / 次。xiangqin 用户规模 1000 / 月 → ¥300-500 / 月。

## 工作量估算

- 接入 OCR API + 存储：2-3 天
- 接入人脸核身：2 天
- 前端上传 + 活体流程：2 天
- 审核 / 兜底（API 挂了怎么办）：1 天
- 测试 + 上线：1-2 天

**单人全职 1.5-2 周**。

## 不做

- 不存储明文身份证号（hash 即可满足合规 + 反查）
- 不做 OCR 自研（云厂商准确度 + 合规性 > 自研）
- 不做未成年判断（二代身份证 OCR 自动返回年龄 → 业务层拒注册 < 18）

## 相关凭证

需要新 vault credential：
- aliyun RAM 子账号 with 实人认证 + OCR 权限
- 按调用计费

## 相关

- blueprint: production-readiness P0-1
- vault.json 要声明新 credential 后才能接入

## 讨论

### 2026-04-23 22:00 @team-lead — v0.6.0 生产上线

PRD-001 拆解 + 实现 + 灰度全部完成：

**落地范围（v1）**：
- ✅ 身份二要素核验（姓名 + 身份证号） — 阿里云 Cloudauth `Id2MetaVerify`
- ✅ 未实名用户发信拦截（`mail.send` 前置 `assert_user_verified`）
- ✅ 身份证号 UNIQUE 索引防同证多注册
- ✅ 24h 3 次失败限流
- ✅ DSL `verified` 字段（用户自由过滤）+ 结果带实名标签
- ✅ 白名单测试号 mock（不扣真钱）+ CI E2E 冒烟

**v2 留给未来**（不在本 issue）：
- 活体检测 / 人脸比对 / 照片 OCR 辅助
- 港澳台证件 / 外国人证件
- 人工申诉通道

**交付 commit / release**：
- FEAT-033 / 031 / 030 / 031' / 034 / 035 全合并到 `v0.6.0`
- 生产 epsilon 健康：`{"status":"ok","version":"0.6.0"}`
- DB 迁移到位：users.verified_at / cert_id_hash / legal_name / realname_failed_count

**阿里云配置**：
- 主账号（UID 1577573550634833，杭州阿空有限公司）已开通"信息核验"子产品（后付费 ¥0.3-0.5/次）
- 现有 `aliyun-main` AK 权限足够（POC 已验证）

**相关**：
- PRD [PRD-001 实名认证](../prd/PRD-001-realname-verification.md) approved → shipped
- blueprint [production-readiness.md](../blueprints/production-readiness.md) P0-1 关闭
- plan [M7-compliance.md](../plan/M7-compliance.md) 实名认证勾完
