端到端加密方案
目的
用户可以在现有SDK及环信后台服务基础上实现端到端加密(End2End Encryption)。 目前环信暂不支持CA认证中心的服务,提供集成方案仅供参考。
方案概述
使用CA认证中心的方式来实现端到端加密服务。用户在某台设备第一次登录的时候会产生用户密钥相关信息,发送到CA认证中心进行保存。CA存储密钥相关信息包含以下内容:
- 用户名:用户的唯一标识。
- 公钥:客户端产生的RSA1024密钥对公钥。
- 有效期:公钥的有效期时间,超过时间后需要进行密钥对的更新操作。
CA中心存储所有用户密钥相关信息,以用户名作为索引。用户从CA认证中心获取对端用户密钥相关信息,获取密钥相关信息成功后,产生对称密钥用于消息加密, 并且发送到对端完成加密通信。
密钥协商
密钥协商传输过程如下:
- 用户A从CA认证中心以用户B的用户名为索引获取用户B的密钥相关信息。
- 用户A判断用户B的公钥有效期是否有效,无效则不能进行加密传输,有效继续进行下一步操作。
- 用户A计算产生一个128bit的真随机数作为对称加密密钥。
- 用户A使用用户B的公钥对对称密钥进行加密获取加密结果。
- 用户A使用SHA256摘要算法计算对称密钥的hash值,然后使用用户A的本地私钥对hash值进行签名, 获取签名结果。
- 用户A将加密结果和签名结果附加在消息的附加字段中发送给用户B。
- 用户B从CA认证中心获取用户A的密钥相关信息。
- 用户B判断用户A的公钥有效期是否有效,无效则不能进行加密传输,有效继续进行下一步操作。
- 用户B接受消息后从消息附件字段中取出加密结果和签名结果。
- 用户B使用自己本地的私钥对对称密钥的加密数据进行解密获取对称加密密钥。
- 用户B使用SHA256摘要算法计算解密的对称密钥的hash值。
- 用户B使用hash值和用户A的公钥对签名数据进行验签操作。确认对端确实为用户A。
- 用户B确认为用户A后使用对称密钥进行消息的解密操作。
密钥协商传输过程如下图:
消息加密传输
- 密钥协商成功后密钥会跟随第一条加密消息发送到对端。
- 对端解密且验证密钥产生端之后使用该对称密钥进行消息加密传输。
- 两端可以将该对称密钥存储到本地数据库中保存,使用该对称密钥解密传输数据。
- 两端任意一端可以随时更新该对称密钥,只需要按照密钥协商传输规则产生新的密钥跟随消息发送到对端即可。
CA存储密钥相关信息更新
用户可以自己定义密钥更新策略。在CA存储公钥到达有效期或者是用户手动更新CA存储密钥的时候,可以使用以下逻辑保证CA密钥相关信息的更新。
- 客户端生成一个新的RSA密钥对。
- 客户端使用SHA1摘要算法对新密钥对公钥进行计算获得hash值。
- 客户端使用原私钥对hash值进行签名处理,获取签名值。
- 客户端将新公钥数据,计算的签名值和新的密钥的有效期数据上传至CA认证中心。
- CA认证中心使用SHA1摘要算法计算新公钥的hash值。
- CA认证中心使用计算的hash值和原密钥对公钥对签名数据进行验签操作,确认上传新公约的用户为原用户。
- CA认证中心在验证通过后更新存储的密钥相关消息。
- 客户端本地使用新密钥对作为本地认证标识。保留原密钥对一段时间后删除(保留原因为防止服务器密钥更换期间进行密钥协商传输)。
CA存储密钥更新过程如下: