端到端加密多设备同步
用户的数据只有用户能看到,开发人员也不能看到!了解端到端加密的基本原理和实现流程
1 加密方式

密钥分为对称密钥
和非对称密钥
,非对称密钥是一对的,用一个加密,就得用另外一个解密。
密钥类型 | 用法(一般情况) | 存储位置(一般情况) |
对称密钥 (key) | 对内容进行加解密 | 不存储 |
公钥(public key) | 对称密钥分发(端到端加密)、签名验证 | 服务端 |
私钥(private key) | 对称密钥分发(端到端加密)、签名验证 | 客户端 |
2 端到端加密技术流程
场景: 甲方向乙方发送消息
- 甲方(发送方)
- 生成
消息对称密钥
,对明文消息
进行对称加密,获得密文消息
- 向服务端发送请求,获得
乙方公钥
- 用
乙方公钥
对消息对称密钥
进行加密,获得共享密钥
- 向乙方发送
密文消息
和共享密钥
- 生成
- 乙方(接收方)
- 收到
密文消息
和共享密钥
- 用
乙方私钥
对共享密钥
解密,获得消息对称密钥
- 用
消息对称密钥
对密钥消息
解密,获得明文消息
- 收到
3 数字签名技术流程
场景: 甲方向乙方发送消息,甲方表明确实来自自己
- 甲方(发送方)
- 对
明文消息
进行哈希计算,得到甲方摘要消息
- 用
甲方私钥
对甲方摘要消息
加密,得到甲方签名
- 向乙方发送
明文消息
和甲方签名
- 对
- 乙方(接收方)
- 收到
明文消息
和甲方签名
- 向服务端发送请求,获得
甲方公钥
- 用
甲方公钥
对甲方签名
解密,获得甲方摘要消息
- 对
明文消息
进行哈希计算,得到乙方摘要消息
- 比对
甲方摘要消息
和乙方摘要消息
,如果一致,说明消息未被篡改,如果不一致,说明消息被篡改,不可信。
- 收到
4 E2EE多设备同步
场景: 用户同时有手机和电脑,需要实现2个设备的加密消息同步
解法: 对照E2EE的技术流程,将每一个设备视为一个用户
4.1 设备注册
新设备登录时,当前设备生成密钥对,将公钥发送到服务端存储。针对Web App无法实现设备级的识别,只能将设备+XX浏览器
视为一个设备,是客户端级别的。
4.2 增量消息
场景: 手机上记录消息,电脑上同步消息
存储: 放在服务端,客户端不存储消息
手机(记录方)
生成
消息对称密钥
,用消息对称密钥
对明文消息
加密,得到密文消息
用
手机公钥
和电脑公钥
对临时对称密钥
加密,得到共享密钥组
,结构如下:[
{
"device": "mobile",
"share_key": "**********"
},
{
"device": "pc",
"share_key": "**********"
}
]对
密文消息
进行哈希计算,得到手机摘要消息
用
手机私钥
对手机摘要消息
加密,得到手机签名
向服务端发送
密文消息
、共享密钥组
、手机签名
服务端(存储方)
- 用
手机公钥
对手机签名
解密,获得手机摘要消息
- 对
密文消息
进行哈希计算,获得服务端摘要消息
- 比对
手机摘要消息
和服务端摘要消息
,如果一致则存储密文消息
和共享密钥组
,如果不一致则拒绝存储,并提示风险
- 用
电脑(同步方)
- 向服务端拉取消息,获得
密文消息
和电脑共享密钥
- 用
电脑私钥
对电脑共享密钥
解密,得到消息消息密钥
- 用
消息对称密钥
解密密文消息
,得到明文消息
- 向服务端拉取消息,获得
4.3 存量(历史)消息
需求场景: 新设备接入后,需要同步历史消息
假设: 服务端已经存储100条历史消息
- 平板(新设备)
- 提示:用旧设备推送100条历史消息
- 手机(旧设备)
- 拉取100条历史消息的
共享密钥组
- 用
手机私钥
解密共享密钥
,得到每条消息的消息对称密钥
- 用
平板公钥
加密消息对称密钥
,推送到服务端 - 服务端更新100条历史消息的
共享密钥组
- 拉取100条历史消息的
- 平板(新设备)
- 用
平板私钥
解密平板共享密钥
,得到消息对称密钥
- 用
消息对称密钥
解密密文消息
,得到明文消息
- 用
更新日志
- 20250628:初稿