如何安全实现第三方数据到用户的传输?类荷兰新冠疫苗二维码App技术咨询
针对疫苗接种二维码应用的技术疑问答复
1. 现有工作流的安全性评估
你的基础设计在匿名性上的思路是成立的:如果数据库仅存储无用户身份关联的随机ID、公钥和加密后的接种数据,且服务器不留存注册、请求环节的可关联用户身份的日志(如IP、设备指纹等),理论上无法直接通过数据库泄露追溯到具体用户,匿名性符合设计预期。
但现有工作流存在以下未考虑到的重大漏洞:
- 4位随机码安全性不足:仅4位的字符码最多只有140万种组合,未设置有效期、失败次数限制的前提下,攻击者可通过暴力遍历批量上传伪造的接种数据,篡改任意用户的接种记录。
- 接种方请求无身份校验:未对接种机构的上传请求做身份校验,任何第三方只要拿到有效4位码,都可以向服务器上传假的接种数据。
- 私钥存储风险:未提及用户端公私钥的存储方案,如果私钥存在普通文件目录,手机被Root/越狱后私钥会直接泄露,接种数据也会被窃取。
- 注册接口无防护:如果注册接口无反爬、限流机制,攻击者可批量生成公私钥请求注册,耗尽服务器存储资源。
2. 嵌套JWT的标准实现方式
你需要的结构是JWE(加密JWT)嵌套JWS(签名JWT),这是JWT规范(RFC7519)明确支持的标准用法,实现逻辑如下:
- 服务器侧先完成内层签名JWS的生成:用服务器持有的非对称签名私钥,对原始接种数据(姓名、接种时间、疫苗类型等)做签名,生成仅签名未加密的JWS,该JWS可通过服务器的签名公钥验证合法性。
- 再完成外层加密JWE的生成:将第一步生成的JWS整体作为JWE的Payload,用用户上传的公钥加密生成JWE,存入数据库的
vaccination_data字段。 - 用户端获取到外层JWE后,用本地存储的私钥解密得到内层JWS,直接将JWS字符串编码为二维码即可,无需解析内层JWS的内容。
- 核验端内置服务器的签名公钥,扫码获取到JWS后,可直接离线验证签名有效性,无需连接服务器,同时JWS的内容可直接读取用于展示接种信息。
标准实现无需自定义结构,主流JWT开发库均原生支持JWE嵌套JWS的生成与解析。
3. 签名与加密算法选择建议
选择算法核心要兼顾安全性、性能、二维码容量限制三个需求,推荐方案如下:
签名算法选择
优先使用ES256(ECDSA P-256 + SHA-256):
- 属于非对称签名算法,仅需要向核验端公开服务器的公钥,不存在密钥泄露风险
- 签名长度远短于同安全等级的RS256(ES256签名长度为64字节,RS256为256字节),生成的JWS更短,更容易适配二维码的容量限制
- 禁止使用对称签名算法(如HS256),也禁止使用已被标记为不安全的弱算法(如none、RS1、ES1等),所有JWT库需默认禁用弱算法支持。
加密算法选择
JWE加密推荐组合:密钥管理算法用ECDH-ES,内容加密算法用A256GCM:
- 该组合是目前移动场景下性能最优、安全性最高的JWE加密方案,加密解密速度快,对移动端算力消耗低
- 禁止使用RSA类加密算法,同等安全等级下密钥和密文长度过长,会大幅增加JWE的长度,浪费存储和传输资源。
内容的提问来源于stack exchange,提问作者Evert
相关产品推荐
相关产品推荐

