验证应用请求真实性集成设计实践
本文档提供了验证应用请求真实性的集成设计方案实践。

创建密钥确立可信凭证流程
一个登录用户只进行一次创建密钥确立可信凭证流程,触发时机为用户登录成功。
-
查询应用公私钥对是否存在:应用公私钥对的别名Alias取值:固定值“serviceKey”+ 用户ID。
如果应用公私钥对已存在,则说明用户在本设备曾经登录过,“创建密钥确立可信凭证”流程结束;否则进入步骤2。
-
创建应用公私钥对:创建一个用于证明设备真实性和应用身份的非对称算法密钥对(包含应用公钥和应用私钥),比如RSA、ECC算法的密钥对。
-
获取挑战值Challenge:为了在步骤6“发送密钥证明证书链”中,能够防重放攻击,建议应用先从应用服务器获取一次性的挑战值Challenge。应用服务器采用安全随机数生成挑战值Challenge,并缓存到服务器中,缓存包含如下字段:
用户ID,Challenge值,业务流程(如“创建密钥确立可信凭证流程”)。
-
对应用公钥和应用ID进行证明:调用Universal Keystore Kit密钥证明接口对生成的应用公钥和调用的应用身份进行证明,应用输入挑战值Challenge。
-
获取密钥证明证书链:Universal Keystore Kit返回密钥证明证书链,包含应用公钥、挑战值Challenge、应用ID等。
-
发送密钥证明证书链:应用将密钥证明证书链发送到应用服务器。
请求消息包含:用户ID、密钥证明证书链。
-
对密钥证明证书链进行校验:应用服务器使用Universal Keystore Kit官网提供的根证书对证书链合法性进行校验,以及对挑战值Challenge、应用ID进行校验。
(1)先参考样例代码完成证书链合法性校验,并解析出应用公钥、挑战值Challenge、应用ID、密钥管理部件ID。
(2)根据请求消息中的用户ID、Challenge到服务器缓存查找是否存在相关的记录,且业务流程为“创建密钥确立可信凭证流程”,并删除缓存的Challenge记录。
(3)校验应用ID是否与预期的应用一致,包括应用包名和应用签名密钥。
(4)校验密钥管理部件ID是否取值为0x28c4fb4944afec11b9090242ac120002(代表Universal Keystore Kit的部件ID)。
-
保存应用公钥到数据库:应用服务器对证书链校验通过后,计算应用公钥ID(如:应用公钥ID=base64(Sha256(应用公钥))),再把应用公钥保存到服务器的数据库中。
数据库记录包含如下字段:用户ID、应用公钥ID、应用公钥。
应用服务器返回应用公钥ID给应用,并由应用存储应用ID。
签名验签识别真实请求流程
触发时机为应用进行一些安全敏感的端云业务(如抢购、领优惠券)。
-
获取挑战值Challenge:应用先从应用服务器获取一次性的挑战值Challenge。应用服务器采用安全随机数生成挑战值Challenge,并缓存到服务器中,缓存包含如下字段:
用户ID,Challenge值,业务流程(如“密钥使用流程”)。
-
使用应用私钥对业务请求进行签名:调用Universal Keystore Kit签名接口使用指定的应用私钥对业务请求数据进行签名。
需要对“Challenge+业务请求数据”进行签名。
-
获取签名数据:Universal Keystore Kit返回签名数据给应用。
-
发送业务请求:应用发送业务请求到应用服务器。
请求消息包含:用户ID、应用公钥ID、Challenge、签名数据。
-
根据应用公钥ID查找应用公钥:应用服务器根据应用公钥ID查找应用公钥,并校验挑战值Challenge。
(1)根据请求消息中的用户ID、Challenge到服务器缓存查找是否存在相关的记录,且业务流程为“密钥使用流程”,并删除缓存的Challenge记录。
(2)再根据用户ID、应用公钥ID到数据库查询应用公钥。
-
使用应用公钥对请求的签名进行校验:应用服务器使用应用公钥对请求中的签名进行校验。
-
如果应用公钥在服务器的数据库不存在:向客户端返回应用公钥未注册的错误码。
应用按照流程图的1.3
1.8流程进行创建密钥确立可信凭证处理,处理成功后再重试2.12.6的业务流程。应用可能会基于服务器数据库容量的考虑,会删除长时间不使用的应用公钥记录,此时会触发步骤7。