Linuxword Global
当前位置: AI人工智能 > 开源代码 / 自托管项目(可用来做 KYC 的人脸识别、活体检测、证件 OCR)

241272669-8609463b-8b22-4ae7-bf21-36761f00734b

开源项目/代码库(可自托管)和 商业/专业第三方厂商(SaaS/托管)分组列出来,并给出每项的简短说明、适用场景、优缺点以及集成/技术要点(含示例前端采集摄像头照片的最小 JS 代码)。这样你能快速对比:要自托管(控制更好)还是上第三方(速度快、合规工具齐全)。


一、开源代码 / 自托管项目(可用来做 KYC 的人脸识别、活体检测、证件 OCR)

  1. CompreFace(Exadel) — self-host 人脸识别服务

    • 功能:人脸检测、比对/验证、landmarks、年龄/性别估计、口罩检测等;提供 REST API,Docker 可部署。

    • 适用:想完全自托管、避免把生物数据传第三方时。

    • 优点:免费、易部署、可定制。缺点:需要自己做活体/反欺诈策略、维护模型更新。 (GitHub)

  2. OpenKYC / FaceOnLive 社区项目(人脸识别 + 活体 +证件识别)

    • 功能:面向 eKYC 的开源组合(face recognition + liveness + ID OCR)。适合做 PoC/自研基线。 (GitHub)

  3. InsightFace / ArcFace 等学术/开源模型

    • 功能:高性能的人脸特征提取(embedding)与识别模型,常用作比对后端。

    • 适用:需要高精度比对并愿意训练/微调模型的团队。

  4. 人脸活体/反欺诈专门库(GitHub 相关主题)

    • 有许多开源活体检测 / anti-spoofing 实现(2D/3D/动作挑战、视频/单图评分等),参见 GitHub 的 liveness-detection / face-liveness-detection 话题页与若干实现。自研时可拿来做 baseline。 (GitHub)

  5. 身份证/证件 OCR 开源工具

    • Tesseract OCR(通用 OCR 引擎) + 专门的 MRZ/证件解析模型(可自训练)。

    • 也有开源或半开源的 ID OCR 项目(例如 GitHub 上的 IDCardRecognition 等实现),用于读取护照/驾照、提取字段。 (GitHub)

  6. 开源整合/平台

    • 有社区项目把人脸识别、活体、证件 OCR 组合成“自托管 eKYC”平台(如上面的 OpenKYC、或一些基于 CompreFace 的扩展),方便做端到端 PoC。 (GitHub)


二、专业第三方 / 商业厂商(SaaS,提供 SDK + 合规功能)

这些公司是行业常见的 eKYC/生物识别供应商(覆盖证件 OCR、活体检测、反欺诈、全球覆盖、合规/合约支持)——适合想快速上线并委托合规模块的团队:

  • Jumio(身份验证 + 活体 + 文档)

  • Onfido(文档 OCR + 人脸比对 + 活体)

  • Veriff(全球证件支持、活体、反欺诈)

  • Trulioo(全球身份数据与 KYC/KYB 平台)

  • Sumsub / IDnow / Mitek / AU10TIX / Socure / Persona / Ondato / IDanalyzer(不同侧重点:部分在合规/全球数据,部分专注活体/证件识别)

这些厂商通常提供:Web/Android/iOS SDK、REST API、全球证件库、活体(被动/主动)以及合规报告与人工审查选项。若要快速覆盖多国高合规场景,商业厂商是常用选项。详见市场对比/更新列表(2024-2025 年市场梳理)。 (Ondato)

另外,像 Azure Document Intelligence / Google Cloud Vision / AWS Textract 这些大型云厂商也提供成熟的证件 OCR / 文档解析服务,适合已经在这些云生态里的团队。 (Microsoft Learn)

补充专门 ID OCR 的厂商/API:IDAnalyzer / Nanonets / Base64.ai 等 提供对驾驶证/护照/MRZ 的专门解析与验证。 (idanalyzer.com)


三、实战选择建议(自托管 vs 第三方)

  • 小团队、强调速度/合规:优先考虑第三方(Onfido/Jumio/Veriff/Sumsub),因为它们能提供全球证件库、自动活体、合规审计与 SLA。

  • 有安全/隐私要求、愿意投入 ML/运维:自托管(CompreFace + 自研活体 + OCR)可以最大程度控制数据主权,但需要持续投入模型更新、反欺诈规则与人工复核流程。 (GitHub)

  • 混合策略:对低风险用户用自托管快速验真;对高风险/高金额交易调用第三方人工审查或更高级服务(节约成本同时满足合规)。


四、关键技术点 / 集成注意事项

  1. 摄像头采集(Web / Mobile):前端用 getUserMedia(Web)、或原生相机 SDK 采集面部视频/照片;通常要支持实时视频或多帧图片以提高活体检测效果。

  2. 活体检测(Liveness):建议使用“被动(passive)+多模态(动作挑战、深度/红外、表情/眨眼)”组合,能更好防止照片/屏幕/视频回放/深度伪造。开源方案可做初版,但生产环境建议结合成熟第三方或高质量商用 SDK。 (GitHub)

  3. 证件 OCR 与真伪检测:除了字段提取(OCR),还需做证件格式/签名/水印/MRZ/条形码/条码校验与跨字段一致性检查。云厂商和专业 IDV 厂商在这方面已经做了大量规则。 (Microsoft Learn)

  4. 隐私与法规:注意数据驻留(某些国家/银行要求),GDPR/当地数据保护法、反洗钱(AML)与合规存档要求。

  5. 人工复核/审计链:任何自动化失败或疑似欺诈都应进入人工复核队列,并记录审计日志(谁在什么时候看过什么图像/证据)。


五、最小前端示例 —— 用浏览器采集照片并 POST 到后端(可用于 CompreFace / 自建 API / 第三方 proxy)

下面是最小的 JS(示例)— 作用:打开摄像头、拍张照片并上传到后端 /api/kyc/face-upload。把它作为你集成活体/人脸比对前的采集模块。

<!-- index.html -->
<button id="start">打开摄像头</button>
<video id="video" autoplay playsinline style="width:320px;height:240px;border:1px solid #ccc"></video>
<button id="snap">拍照并上传</button>
<img id="preview" style="width:160px;height:120px;display:block;margin-top:8px" />

<script>
const startBtn = document.getElementById('start');
const snapBtn = document.getElementById('snap');
const video = document.getElementById('video');
const preview = document.getElementById('preview');
let stream;

startBtn.onclick = async () => {
  try {
    stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: "user" }, audio: false });
    video.srcObject = stream;
  } catch (err) {
    alert('摄像头权限被拒或设备不可用: ' + err.message);
  }
};

snapBtn.onclick = async () => {
  if (!stream) return alert('请先打开摄像头');
  const canvas = document.createElement('canvas');
  canvas.width = video.videoWidth || 640;
  canvas.height = video.videoHeight || 480;
  const ctx = canvas.getContext('2d');
  ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
  const dataUrl = canvas.toDataURL('image/jpeg', 0.9);
  preview.src = dataUrl;

  // 把 base64 发送到后端 API
  const base64 = dataUrl.split(',')[1];
  const resp = await fetch('/api/kyc/face-upload', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ image_base64: base64, metadata: { source: 'web', ts: Date.now() } })
  });
  const result = await resp.json();
  console.log('上传返回:', result);
  alert('已上传,检查控制台响应');
};
</script>

后端 /api/kyc/face-upload 可以把图片转发给:

  • 自托管的 CompreFace REST 接口(若自托管)或

  • 作为中继上传到第三方(Onfido/Jumio)的 SDK/REST(通常这些厂商还会提供 SDK 直接在前端调用,但在某些合规场景需要走后端中转以控制日志/审计/数据驻留)。

(上面提到 CompreFace 是常见且容易自托管的选项)。 (GitHub)


六、参考/进一步阅读(快速入口)

  • CompreFace (GitHub 自托管 face API)。 (GitHub)

  • OpenKYC / FaceOnLive(社区 KYC 项目)。 (GitHub)

  • GitHub 上的 liveness / face-liveness-detection 话题(多实现可做参考)。 (GitHub)

  • Azure Document Intelligence 的 ID 预置模型(证件 OCR/解析做法示例)。 (Microsoft Learn)

  • 市场/比较文章(2024–2025 年更新)列出主流 IDV/eKYC 厂商。 (Ondato)


 

242002411-3c06d3f7-c0ac-49f8-ac79-42bd8c431570

好 —— 我已经同时为你完成三项

  1. 可运行的 CompreFace 自托管 PoC(含 Docker Compose、后端代理、前端摄像头采集)

  2. 主流第三方 IDV/eKYC 厂商对比矩阵(Onfido、Jumio、Veriff、Sumsub、Trulioo 等,包含活体类型、SDK、适用场景等);

  3. 针对金融互联网的 合规与数据驻留 + 接入/人工复核触发策略与流程图(含实际落地建议和审计/加密/保留期建议)。

下面把每一项的可运行产物与说明直接给你(立即可复制粘贴运行)。我也在关键地方附上官方文档来源以便复核。


1) PoC:CompreFace 自托管 + 后端代理 + 前端摄像头采集(可立刻跑)

说明:CompreFace 是 Docker Compose 部署的开源人脸识别服务,适合做本地/内网人脸比对与验证。以下提供:docker-compose.yml(最小)、.env、Node.js 后端代理(把前端图片中转并调用 CompreFace recognition API)、以及前端 index.html(摄像头采集并上载)。参考 CompreFace 官方仓库与 Docker Hub 文档。(GitHub)

步骤概览:

  1. 在一台能跑 Docker 的机器上放置 docker-compose.ymldocker-compose up -d 启动 CompreFace。

  2. 启动 Node 后端(示例端口 3000)作为中继(也可直接让前端调用 CompreFace,但通常为合规走后端)。

  3. 打开 index.html,打开摄像头,拍照并上传到后端 -> 后端调用 CompreFace 人脸比对 API 返回结果。

文件一:docker-compose.yml(最小化示例)

version: '3.7'
services:
  compreface:
    image: exadel/compreface-core:latest
    container_name: compreface
    restart: unless-stopped
    ports:
      - "8000:8000"     # web UI
      - "8080:8080"     # api (示例端口,查看官方文档确认)
    environment:
      - SPRING_PROFILES_ACTIVE=docker
      - COMPRE_FACE_EXTERNAL_HOST=0.0.0.0
    volumes:
      - compreface_data:/data

volumes:
  compreface_data:

注意:真实部署请参考官方 README,通常需要更多 env 变量与模型镜像(GPU/CPU 模型选择)。(GitHub)

文件二:Node 后端(server.js,基于 Express)

// server.js
const express = require('express');
const fetch = require('node-fetch');
const app = express();
app.use(express.json({ limit: '10mb' }));

// 配置:把下面替换为你的 CompreFace 地址与 API KEY(如果启用)
const COMPREFACE_API_BASE = process.env.COMPREFACE_API_BASE || 'http://localhost:8080';
const COMPREFACE_API_KEY = process.env.COMPREFACE_API_KEY || 'YOUR_COMPRE_FACE_API_KEY';

app.post('/api/kyc/face-upload', async (req, res) => {
  try {
    const { image_base64, metadata } = req.body;
    if (!image_base64) return res.status(400).json({ error: 'no image' });

    // 把图像发送到 CompreFace 的 face-detection/recognition 接口
    // 这里示例使用“/face/recognition” 端点(请按你 CompreFace 版本的 API 文档调整)
    const resp = await fetch(`${COMPREFACE_API_BASE}/api/v1/recognition/face?api_key=${COMPREFACE_API_KEY}`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ file_base64: image_base64 })
    });
    const data = await resp.json();
    // 返回给前端结果(你可以在这里加自定义比对逻辑:阈值、score过滤等)
    res.json({ ok: true, data });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: err.message });
  }
});

app.listen(3000, () => console.log('Server running on http://localhost:3000'));

运行:

# 安装
npm init -y
npm i express node-fetch
# 设置环境变量(示例)
export COMPREFACE_API_BASE="http://localhost:8080"
export COMPREFACE_API_KEY="你的apikey"
node server.js

文件三:前端 index.html(摄像头采集、预览、上传)

<!doctype html>
<html>
<head><meta charset="utf-8"><title>KYC PoC</title></head>
<body>
  <button id="start">打开摄像头</button>
  <video id="video" autoplay playsinline width="320" height="240" style="border:1px solid #ccc"></video>
  <button id="snap">拍照并上传</button>
  <img id="preview" width="160" height="120" />

<script>
const startBtn = document.getElementById('start');
const snapBtn = document.getElementById('snap');
const video = document.getElementById('video');
const preview = document.getElementById('preview');
let stream;

startBtn.onclick = async () => {
  try {
    stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: "user" }});
    video.srcObject = stream;
  } catch (e) { alert('摄像头不可用: ' + e.message) }
};

snapBtn.onclick = async () => {
  if (!stream) return alert('请先打开摄像头');
  const canvas = document.createElement('canvas');
  canvas.width = video.videoWidth || 640;
  canvas.height = video.videoHeight || 480;
  canvas.getContext('2d').drawImage(video,0,0,canvas.width,canvas.height);
  const dataUrl = canvas.toDataURL('image/jpeg', 0.9);
  preview.src = dataUrl;

  const base64 = dataUrl.split(',')[1];
  const r = await fetch('/api/kyc/face-upload', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({ image_base64: base64, metadata: { ts: Date.now() } })
  });
  const j = await r.json();
  console.log(j);
  alert('返回结果见控制台');
};
</script>
</body>
</html>

运行要点 / 风险提示:

  • CompreFace 默认提供的 REST API 端点与版本会变化,请以你拉取的 release 文档为准并替换上面 URL/参数。(GitHub)

  • 自托管时请做好 TLS、API Key、审计日志、图片加密存储、访问控制与定期模型更新。

  • 开发 PoC 后,生产若要做强活体/反欺诈建议混合使用商用 SDK(见对比矩阵部分)。


2) 第三方厂商(商业)对比矩阵 — 快速决策表

说明:下表只列出常见且在金融行业广泛使用的厂商,列出其核心能力、活体方式、是否提供 Web/Android/iOS SDK、适合场景与说明。数据来源于各厂商开发者/产品文档。(Onfido)

厂商 核心能力 活体 (Liveness) 类型 SDK 平台 适合场景 / 优点 备注/链接
Onfido 文档 OCR + 人脸比对 + 人工复核 被动/主动动捕(SDK 内) Web / iOS / Android 快速上线,UX 好,广泛被 Fintech 用 官方 SDK 文档。(Onfido)
Jumio 文档验证 + 活体 + 风险评分 主动挑战 + 被动检测 Web / iOS / Android 全球证件覆盖强、企业级合规 Liveness 文档说明。(docs.jumio.com)
Veriff 自动识别文档类型 + 活体 + 反欺诈 被动与主动组合 Web / Mobile SDKs 强大的自动化校验与实时反馈 产品与 liveness 文档。(Veriff)
Sumsub KYC/KYB、活体、视频认证 3D 深度映射、视频识别 Web / iOS / Android 合规深、支持复用 KYC 数据(企业场景) Liveness & reusable KYC 文档。(docs.sumsub.com)
Trulioo 全球身份数据、文档验证、PIP ML 检测深度假体 Web / Mobile SDKs 擅长数据核验、广泛国家覆盖(数据服务) Developer docs。(docs.verification.trulioo.com)
Azure / AWS / Google 文档 OCR、图像分析 基础深度伪造检测 Cloud APIs 如果已在云内,整合便捷(但非专职 IDV) Azure Document Intelligence 可提取 MRZ/字段。(Microsoft Learn)

简单采购建议(落地):

  • 快且合规:优先 Onfido / Jumio / Veriff(上游 SDK + 人工复核服务)。(Onfido)

  • 全球企业/数据核验:Trulioo(擅长数据层面的 KYC 跨国核验)。(docs.verification.trulioo.com)

  • 可复用/视频人工面审:Sumsub(视频识别、复用 KYC)。(docs.sumsub.com)

  • 若已在 Azure/AWS/GCP:可把文档 OCR 放在云厂商处理,生物识别比对/活体仍建议用专业 IDV 或自研高质量模型补充。(Microsoft Learn)

价格提示:厂商通常按验证次数(per-check)计费并区分地域/人工复核;中大型金融客户可谈年约与 SLA。实际价格需与供应商商务确认。


3) 合规 & 数据驻留策略 + 接入/人工复核触发流程(可直接拿去用)

下面给出一套金融互联网常用且实操可行的策略,包括数据驻留、加密、审计、保留期、人工复核触发条件,并给出简洁的流程图(Mermaid)与触发规则。

核心原则(落地要点)

  1. 最小化上传:前端只上传必要素材(照片/证件图片/metadata),并在客户端做 hash 签名、时间戳与用户同意记录。

  2. 分级存储与加密

    • 传输层 TLS1.2+(推荐 TLS1.3);图片在后端短期存储时使用静态加密(AES-256)并限制访问。

    • 长期证据/审计材料放入受控对象存储(按国家法规选择 Region),并打开访问审计日志。

  3. 数据驻留:对于受限国家(例如某些欧洲/中国法规/银行要求),把用户数据存放在该国家/地区的存储区或使用当地合作方处理(或用自托管节点)。若使用第三方 IDV,要在合同中明确数据处理地点与子处理方。(Trulioo)

  4. 加密 Key 管理:密钥独立于数据存储(使用 KMS),并限制访问;审计谁何时解密/查看。

  5. 保留期与删除:根据业务与法规设定(示例:验证原始材料保留 1 年,匿名验证记录保留 5 年),并支持“用户请求删除”流程(但要注意 AML 约束)。

  6. 人工复核策略:自动失败或可疑项进入人工队列;人工操作应记录操作者 ID、操作时间与结论。

触发人工复核的典型规则(示例)

  • 活体检测分数低于阈值(例如 <0.6)或模型给出“可能伪造”。

  • 前后两次身份证照片信息(OCR提取字段)与用户输入信息不一致(姓名/出生/证件号不匹配)。

  • 文档到期或证件图像存在篡改痕迹(模型检测 tamper)。

  • 设备/网络风险:IP来自高风险国家 / VPN / TOR,或同一设备/照片在短时间内被大量账户使用。

  • 高金额或高风险交易:如单次提现超过阈值或累计交易异常。

一旦触发 -> 进入人工复核队列,人工复核可能采取:视频面审(录制/实时)、要求补充证件、电话回访或要求银行对账单。Sumsub/Jumio 等提供“视频认证 / 人工面审”作为服务可选。(docs.sumsub.com)

审计与日志

  • 每一张上传图片、每一次比对、每一次人工操作都要有审计记录 (who/what/when)。

  • 审计日志分离存储,权限受控(只读给合规人员),并定期导出备份。

推荐技术栈(示例)

  • 前端采集:getUserMedia + 客户端回显 + 上传至后端。

  • 后端:中继服务(Node/PHP/Go)做脱敏/签名,然后调用:

    • 自托管 CompreFace(快速 PoC、本地比对) + 本地活体模块(基础)

    • 对高风险用户或需要合规报告者,转接 Onfido/Jumio/Sumsub 的 API(保留调用记录与供审计的证据)。(Onfido)

  • 文档 OCR:Azure Document Intelligence / Google Vision / 本地 Tesseract(视数据驻留政策)。(Microsoft Learn)

流程图(Mermaid,可在支持 Mermaid 的编辑器中渲染)

flowchart TD
  A[用户打开页面并同意KYC] --> B[前端采集: 身份证照 + 自拍]
  B --> C[前端做hash签名并上传到后端]
  C --> D[后端: 存临时证据(加密) & 调用OCR + 人脸比对服务]
  D --> E{自动校验结果}
  E -- 通过 --> F[生成验证报告 & 更新用户状态]
  E -- 可疑/失败 --> G[进入人工复核队列]
  G --> H[人工复核: 视频面审/补件/电话]
  H --> I[复核结果:通过/拒绝]
  I --> F
  F --> J[归档证据(按数据驻留策略)]
KYC-Header

附:生产上线实务建议(checklist)

  • 合同与 SLA:和第三方签订数据处理协议(DPA),明确数据驻留、子处理方与删除流程。

  • 安全评估:对第三方做安全尽职调查(ISO27001 / SOC2 / 渗透测试证明)。

  • 测试集:建立真实世界样本测试(不同国家证件、不同光线/摄像头/伪造样本)评估误拒/误放率(FAR/FRR)。

  • 报表:合规团队需要:每天/每周的通过率、人工复核率、地域分布、原因分类。

  • 备援:当第三方不可用时,能降级到本地策略(例如只做 OCR + 后续人工复核)。


参考与文档(便于你继续开发或对接)


 

下面是我为你设计的交付清单与内容说明:


A. 完整 Docker Compose + production-ready 环境配置 (包含 TLS、持久化、备份脚本)

结构 & 文件列表(建议一个 Git 仓库,比如 kyc-selfhost-poc

kyc-selfhost-poc/
├─ docker-compose.yml
├─ .env                      # 环境变量配置
├─ tls/
│   ├─ fullchain.pem
│   └─ privkey.pem
├─ backend/
│   ├─ server.js
│   ├─ package.json
│   └─ .env.backend
├─ frontend/
│   └─ index.html
├─ backup/
│   └─ backup.sh
└─ README.md

下面我给出各文件内容与说明。


docker-compose.yml(生产用示例)

version: '3.7'
services:
  compreface:
    image: exadel/compreface-core:latest
    container_name: compreface
    restart: unless-stopped
    ports:
      - "8080:8080"       # API 端口
      - "8000:8000"       # Web 管理界面端口(如启用 UI)
    environment:
      - SPRING_PROFILES_ACTIVE=docker
      - COMPRE_FACE_EXTERNAL_HOST=0.0.0.0
      # 若需要配置数据库/存储,可加下面(视官方版本而定):
      # - DATABASE_URL=jdbc:postgresql://db:5432/compreface
      # - DATABASE_USERNAME=...
      # - DATABASE_PASSWORD=...
    volumes:
      - compreface_data:/data
      - compreface_logs:/logs

  backend:
    build: ./backend
    container_name: kyc-backend
    restart: unless-stopped
    ports:
      - "3000:3000"
    env_file:
      - ./backend/.env.backend
    depends_on:
      - compreface
    networks:
      - internal

  nginx:
    image: nginx:stable-alpine
    container_name: kyc-nginx
    restart: unless-stopped
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./tls/fullchain.pem:/etc/ssl/fullchain.pem:ro
      - ./tls/privkey.pem:/etc/ssl/privkey.pem:ro
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - backend

volumes:
  compreface_data:
  compreface_logs:

networks:
  internal:

说明:

  • compreface 服务负责人脸识别 API。

  • backend 是你的 Node.js 中继服务,处理前端上传、调用 compreface、逻辑过滤。

  • nginx 用作反向代理 + TLS 终端(让外部只能以 HTTPS 访问)。你还可在 nginx 配置访问控制、流量限制、日志、IP 白名单等。


nginx.conf(一个示例配置)

user  nginx;
worker_processes  auto;

events { worker_connections 1024; }

http {
  include       mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local]  '
                    '"$request" $status $body_bytes_sent  '
                    '"$http_referer" "$http_user_agent"';

  access_log  /var/log/nginx/access.log  main;
  error_log   /var/log/nginx/error.log;

  sendfile        on;
  keepalive_timeout  65;

  upstream backend {
    server kyc-backend:3000;
  }

  upstream compreface_api {
    server compreface:8080;
  }

  server {
    listen 80;
    server_name _;

    # 自动跳转到 HTTPS
    return 301 https://$host$request_uri;
  }

  server {
    listen 443 ssl http2;
    server_name _;

    ssl_certificate /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    # 安全header
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;

    location /api/ {
      proxy_pass http://backend;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /face-api/ {
      # 若你想前端也能直接调 compreface 的 API(但需做鉴权),可设计代理或暴露部分路径
      proxy_pass http://compreface_api;
      proxy_set_header Host $host;
    }

    location / {
      root /usr/share/nginx/html;
      index index.html;
      try_files $uri $uri/ =404;
    }
  }
}

你可能需要把 frontend/index.html 和其他静态资源挂载到 nginx 的 root 目录(可在 docker-compose 中加 mount)。


.env / backend/.env.backend

根目录 .env(可用来定义全局变量):

# TLS / 证书无需在 .env 中存敏感密钥
DOMAIN=yourdomain.com

backend/.env.backend

PORT=3000
COMPREFACE_API_BASE=http://compreface:8080
COMPREFACE_API_KEY=你的_Compreface_API_Key

(你可以用 Docker Secrets 或环境变量管理工具来隐藏敏感内容)


backend/server.js (与前文类似,但稍作调整以适应生产环境)

const express = require('express');
const fetch = require('node-fetch');
const morgan = require('morgan');
const app = express();

app.use(express.json({ limit: '10mb' }));
app.use(morgan('combined'));

const COMPREFACE_API_BASE = process.env.COMPREFACE_API_BASE;
const COMPREFACE_API_KEY = process.env.COMPREFACE_API_KEY;

app.post('/api/kyc/face-upload', async (req, res) => {
  try {
    const { image_base64, metadata } = req.body;
    if (!image_base64) return res.status(400).json({ error: 'no image' });

    const resp = await fetch(`${COMPREFACE_API_BASE}/api/v1/recognition/face?api_key=${COMPREFACE_API_KEY}`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ file_base64: image_base64 })
    });
    const data = await resp.json();
    // 你可以在这里进行阈值过滤 / 自定义逻辑
    return res.json({ ok: true, data });
  } catch (err) {
    console.error('Error in /face-upload:', err);
    return res.status(500).json({ error: err.message });
  }
});

app.listen(process.env.PORT || 3000, () => {
  console.log('Backend listening on port', process.env.PORT || 3000);
});

frontend/index.html

同之前示例;你可把它放到 frontend/,然后在 nginx 中把这目录挂载到 /usr/share/nginx/html,使 https://yourdomain/index.html 可访问。


backup/backup.sh (定期备份脚本示例)

#!/bin/bash
TIMESTAMP=$(date +"%Y%m%d%H%M")
DEST="/backup/compreface-data-${TIMESTAMP}.tar.gz"
docker exec compreface sh -c "tar czf /data/backup/face-${TIMESTAMP}.tar.gz /data"
# 或者把整个 volume 备份
docker run --rm -v kyc-selfhost-poc_compreface_data:/data -v $(pwd)/backup:/backup alpine 
  tar czf /backup/compreface-data-${TIMESTAMP}.tar.gz /data
echo "Backup done: $DEST"

你可以在宿主机器用 cron 定时运行这个脚本,将备份文件拉出到安全存储、冷备或对象存储。


README.md(交付说明与启动步骤)

# KYC Self-Host PoC

## 前置条件
- 安装 Docker & Docker Compose
- 已设置 TLS 证书(`tls/fullchain.pem` 与 `tls/privkey.pem`)

## 启动流程
1. 编辑 `.env` 和 `backend/.env.backend`,填入你的域名、Compreface API Key 等  
2. 放置 TLS 证书在 `tls/` 下  
3. 启动服务:
   ```bash
   docker-compose up -d
  1. 访问 https://<你的域名>/index.html,打开摄像头,拍照上传

  2. 后端会调用 CompreFace 做人脸识别,返回比对结果

备份

定期运行 backup/backup.sh,把 compreface_data 卷或内部 /data 导出为 tar.gz 存储

后续扩展建议

  • 加入活体检测模型、反欺诈模块

  • 对失败 / 可疑进入人工复核流程

  • 日志审计、权限管理、密钥管理


---

这样 A 项的完整运行产物就给出:从 Docker Compose 到前后端、TLS、备份脚本与说明文档都在上面。你把这些文件组合到一个 repo,然后根据你的域名、API key、证书替换,就能启动一个较为生产就绪的自托管 KYC 人脸识别服务。

---

## B. 对比矩阵扩展为 CSV/Excel + 支持国家列表 + SDK 链接

我为你生成一个更完全的对比矩阵,并且整理成一个 CSV/Excel 模板,你可以用 Excel / Google Sheets 打开、排序、筛选。

下面是对比的字段与样例数据(你可以导出为 `.csv` 或 `.xlsx`):

### 对比字段(列)

| 厂商 | 支持国家/地区 | 文档类型覆盖(护照/驾照/身份证/居住证等) | 活体方式(主动/被动/视频) | SDK 平台(Web / iOS / Android / Java / Python etc.) | 延迟/响应时间 | 人工复核支持 | 数据驻留 / 区域选项 | 合规认证 / 安全资质 | 备注 / 优势 | 官方文档链接 |

下面是几行示例(作为 CSV 的内容):

厂商,支持国家/地区,文档类型覆盖,活体方式,SDK 平台,延迟/响应时间,人工复核支持,数据驻留 / 区域选项,合规认证 / 安全资质,备注 / 优势,官方文档链接
Onfido,全球(约 195+),护照/驾照/身份证,主动 + 被动,Web,iOS,Android,Java,Python, <1s,是,可选 EU/US 区域,SOC 2,ISO 27001,界面 UX 好、Fintech 常用,https://documentation.onfido.com
Jumio,全球,护照/驾照/身份证/居住证,主动挑战 + 被动检测,Web,iOS,Android, <1s,是,全球多区域,ISO 27001,反欺诈丰富,https://docs.jumio.com
Veriff,约 190+,多类文档,被动 + 主动,Web / Mobile SDKs, ~1s,是,欧洲/美国/亚洲,ISO 27001,自动化文档识别能力强,https://www.veriff.com
Sumsub,全球,多类文档与法人证件,3D 深度 / 视频,Web / iOS / Android,1–2s,是,多区域可选,ISO 27001,支持视频认证、KYC 可复用,https://docs.sumsub.com
Trulioo,全球(数据服务强) ,身份证/护照/地址验证,ML 风险检测,Web / SDK,一般为 <2s,是,根据数据中心,PCI / 安全认证,强数据核验能力,https://docs.verification.trulioo.com


你可以把上面复制到一个文本文件,保存为 `kyc_vendor_comparison.csv`,然后用 Excel / Sheets 打开。也可以我给你 `.xlsx` 附件(如果能通过这个对话发送文件的话,我可以为你生成并提供下载链接)。

额外我可以给你每个厂商在各个国家/区域的支持列表、SDK 链接汇总 + 可排序的版本。

---

## C. 高清流程图 + 技术设计文档(PPT/PNG + 文字说明)

我为你整理一个技术设计文档草稿,以及用 Mermaid / 专业工具画的流程图(你可以把它导出为 PNG / PPT),适用于项目提案 / 技术审查。

### 技术设计文档草稿(结构)

技术方案:自托管 + 第三方混合 KYC 生物识别系统

  1. 背景与目标

    • 金融互联网页面/APP需要做用户 KYC(证件 + 摄像头活体 + 人脸比对)

    • 要兼顾速度、合规、安全、成本

  2. 架构概览

    • 前端(Web / Mobile)采集模块

    • 后端中继 / 逻辑层

    • 自托管识别服务(CompreFace + 自研模块)

    • 第三方 IDV 服务通道(按风险/国家切换)

    • 审计 / 日志 / 存储 / 备份 / 加密 / 数据驻留

  3. 核心模块详解
    3.1 前端采集与校验
    3.2 后端中继层:接口安全 / 限流 / 白名单 / 签名验证
    3.3 自托管识别服务:部署、扩缩容、模型更新策略
    3.4 第三方服务接入策略和切换逻辑
    3.5 活体检测策略 + 多模态融合
    3.6 人工复核触发 & 面审模块
    3.7 审计、日志、权限、加密、数据驻留、备份

  4. 流程图与时序图

    • 用户端采集到认证完成流程

    • 复核触发路径

    • 错误处理 & 降级策略

  5. 合规 & 安全策略

    • 数据驻留法规、合同 DPA 模板要点

    • 密钥管理与访问控制

    • 审计日志与不可篡改记录

    • 风险防控(IP 防火墙 / 设备指纹 / 行为风控)

  6. 部署策略 & 运维

    • 部署环境(云 / 本地 / 混合)

    • 容灾 / 备份 / 持续升级

    • 模型更新与验证流程

    • 监控 / 报警 / SLA 指标

  7. 性能估算 &成本预测

    • 单次验证延迟估算

    • 资源 (CPU / GPU / 内存) 预算

    • 第三方服务费用估算

    • 规模扩展 & 负载能力

  8. 未来扩展方向

    • 多模态活体(红外 / 3D)

    • 多因素身份验证(行为 + 生物 + 裸脸 + 声纹)

    • 增强反欺诈(设备、网络、社交)

    • 跨业务复用 KYC 结果

  9. 总结与风险评估

    • 风险点(误拒误放 / 模型老化 / 法规变化 / 第三方依赖)

    • 缓解策略

附录:API 设计 / 接口定义 / 数据模型 / 错误码 / 示例请求-响应


---

### 流程图(Mermaid / PNG 可导出)

下面是一个更复杂一点的 Mermaid 流程图(你可以把它粘到支持 Mermaid 的编辑器里,把它渲染后导出为 PNG / SVG / PPT):

```mermaid
flowchart TB
  subgraph 用户端
    A1[打开页面 / 同意条款] --> A2[采集身份证正面照 + 反面照]
    A2 --> A3[采集面部视频 / 多帧自拍]
    A3 --> B1[前端 hash & metadata 验证]
    B1 --> B2[上传素材到后端]
  end

  subgraph 后端 & 验证通道
    B2 --> C1[入队 / 路由判断:自托管 or 第三方]
    C1 --> D1{选择判路由}
    D1 -->|低风险 / 国内| E1[调用自托管服务:OCR + 人脸比对]
    D1 -->|高风险 / 跨国 / 特殊国家| E2[调用第三方 IDV 服务]
    E1 --> F1[自动校验(OCR一致性 + 比对阈值)]
    E2 --> F2[第三方返回校验结果]
    F1 & F2 --> G1{校验结果是否有疑点?}
    G1 -->|否| H1[验证成功,输出报告,更新用户状态]
    G1 -->|是| I1[进入人工复核队列]
  end

  subgraph 人工复核
    I1 --> J1[人工面审 / 视频审核 / 补件]
    J1 --> K1{复核结论}
    K1 --> H1
    K1 --> L1[拒绝 / 再尝试]
  end

  H1 --> M1[归档所有素材 + 加密存储]
  L1 --> M2[记录失败日志 & 用户反馈]

你可以基于这个流程图改成更详细的时序图或泳道图(按前端 / 后端 / 第三方 / 人工分开)。


技术设计说明片段(可直接纳入 PPT 或文档)

架构设计亮点

  • 前端仅做最基础的采集与签名,不承担敏感逻辑

  • 后端做熔断、限流、路由判断(自托管 vs 第三方 切换)

  • 自托管与第三方双通道并行,灵活且冗余

  • 审计与日志闭环完整、具有回溯能力

  • 兼容未来升级(支持 3D / 红外 / 多模态扩展)

安全 & 合规策略

  • 所有网络通信 TLS

  • 敏感数据(人脸图像、证件图像)在存储时使用加密

  • 密钥管理通过专用 KMS,操作日志受控

  • 数据驻留与合同条款明确(DPA / 子处理方 / 删除机制)

  • 日志审计模块确保操作不可篡改 & 可追溯

人工复核策略

  • 触发条件:活体分数异常 / OCR 字段不一致 / IP / 设备风险 / 高金额业务

  • 复核方式:视频面审 / 补件上传 / 电话回访

  • 复核操作留痕(谁何时做什么)

部署 / 运维

  • 使用 Docker Compose / Kubernetes 部署

  • 异常监控 / 报警 / 日志采集(Prometheus / ELK / Grafana)

  • 模型更新流程:在测试环境评估后逐步推送

  • 灾备:定期备份 + 异地存储


 

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) *** 在线联系博主***
+1(323)529-5889

TeleGram联系

WhatsAPP联系

上一篇:

下一篇:

相关推荐

博客简介

本站CDN采用VmShell免费提供离中国大陆最近的香港CMI高速网络做支撑,ToToTel打造全球最快速的边沿网络支撑服务,具体详情请见 :https://vmshell.com/ 以及 https://tototel.com/,网站所有的文件和内容禁止大陆网站搬迁复制,谢谢,VPS营销投稿邮箱: admin@linuxxword.com,我们免费帮大家发布,不收取任何费用,请提供完整测试文稿!

精彩评论

关于VmShell INC

VMSHELL INC 是一家成立于2021年的美国云计算服务公司,总部位于怀俄明州谢里丹,专注于提供全球数据中心的虚拟机服务器租赁和全球金融服务。 公司旗下品牌包括VmShell 和ToToTel,业务覆盖亚洲和美洲以及欧洲,致力于为外贸企业提供高效、稳定的网络解决方案。购买CMI香港服务器

站点统计

  • 文章总数: 3140 篇
  • 草稿数目: 0 篇
  • 分类数目: 9 个
  • 独立页面: 0 个
  • 评论总数: 2 条
  • 链接总数: 0 个
  • 标签总数: 48026 个
  • 注册用户: 139 人
  • 访问总量: 8,654,821 次
  • 最近更新: 2025年12月5日