概括:通过非对称加密算法获取共享密钥,通过对称加密算法对消息进行加密解密。
一、(非对称算法)获取共享密钥
采用 ECDH 算法获取共享密钥。
1. 公钥私钥什么时候生成?
- 当前设备第一次登录的时候,会生成公钥私钥,公钥保存到服务端,私钥保存在本地。
- 注册的时候
2. 共享密钥什么时候生成?
- 刚加好友的时候/刚进一个群的时候。
- 发现本地没有与一个好友/群的共享密钥的时候。
1. 私聊
发送消息时,需要对消息加密,加密用的是共享密钥。
- 共享密钥生成过程:
- A和B 都会生成各自的公钥和私钥,公钥存在服务端数据库中,私钥保存在本地。
- 根据 ECDH 算法,A 只需要获取到 B 的公钥,可以算得一个共享密钥,这个共享密钥和 B 用 A 的公钥算到的共享密钥是一样的。
- 共享密钥生成后,转为 AES 算法加密的密钥格式
2. 群聊
- 用户加入一个群的时候,会与这个群交换共享密钥,而不是与群内的所有用户交换共享密钥。服务端保存着 群与每个群用户的共享密钥,所以说,一个群有多少个用户,就会生成多少条共享密钥。
- 创建群聊的时候,群聊的公钥和私钥都存在服务端数据库。
- 用户A给群G发送消息时,用A与G的共享密钥加密;服务端获取到消息后,用 A与G 的共享密钥解密,然后把原文存到数据库;转发给群内用户的时候,用G与其他用户的共享密钥加密后再发送。
二、(对称算法)消息加密
- 采用对称加密算法 AES 进行加密,即用什么加密,就用什么解密。
- 服务端获取到私聊消息的时候,不用加密解密,因为服务端没有用户的共享密钥,直接存储消息加密后的二进制格式。
- 服务端收到群聊消息的时候,需要加密解密,存的是消息原文。