- 什么是端到端加密?
- 端到端加密是在源结点和目的结点中对传送的数据进行加密和解密,因此数据的安全性不会因中间结点的不可靠而受到影响。
- BAT的所有数据都通过用户端生成的私钥进行加密后再发送,任何第三方包括开发者都不能解开此数据。
- BAT采用了哪些安全层级?
- 通道加密
- 内容加密
- 服务器数据库安全
- 密钥安全
- BAT加密方式详细信息
- 一、通道加密
- 通道加密中采用了哪些加密算法?
- 通道加密中使用到的 RSA, ECDHE, AES256_CBC, SHA256, SHA1

- 步骤:
-
1.客户端和服务器先产生随机数。
-
2.服务器下发随机数。
-
3.客户端用 RSA 对客户端随机数进行加密,并发送给服务器。
-
4.服务器用 RSA 解密客户端随机数(使用 RSA 的目的是防止中间人攻击)。
-
5.客户端,服务器用自己的随机数加上对方的随机数生成临时密钥 TempKey 和临时偏移量 TempIV (此时双方均持有相同的 TempKey 和
TempIV)。
-
6.客户端服务器均使用 ECDHE 生成各自的公私钥对。
-
7.客户端用 TempKey, TempIV 对自己的 ECDHE 公钥进行加密,并将密文发送给服务器。
-
8.服务器收到客户端的 ECDHE 公钥密文,并解密。
-
9.服务器使用 TempKey, TempIV 对自己的 ECDHE 公钥进行加密,并使用 RSA 对 ECDHE。
-
10.服务器使用 ECDHE 算法,使用客户端 ECDHE 公钥明文+服务器 ECDHE 私钥明文生成ShareKey。
-
11.客户端收到服务器的 ECDHE 公钥密文和签名,然后进行解密和验证签名,如果没有问题,就使用客户端 ECDHE 私钥明文+服务器 ECDHE 公钥明文生成
ShareKey。
-
12.服务器初始化各个参数,下发给客户端,参数包含:
- AuthKeyID: 服务器随机生成的客户端临时标识符。
- MsgKey: 由 ShareKey, AuthkeyID, MsgID, SessionID, Salt, SeqNo 以及真实的消息内容相加后进行
Sha256 后的值。本参数用于:
- a. 进行防止数据篡改的验证
- b. 与 ShareKey 一起使用,生成 Aes256 key, IV,用来对各条消息进行加密
- MsgID:时间相关的消息 ID,用于防止重放和去重。
- SessionID:每次登录唯一的会话 ID。
- Salt:每次登录唯一的盐值。
- SeqNo:用于防止重放。
-
13.后续每条消息均会有不同的 MsgID, SessionID, Salt, SeqNo 和真实的消息内容;这些变化的值会导致 MsgKey
每次都不同。这个每次都不同的 MsgKey 加上 ShareKey 可以为每一条消息生成对应的 32 字节密钥和偏移量。
-
14.ShareKey 会过期,过期后需要重新进行密钥协商。
- 二、内容加密详解

- 内容加密与通道加密采用类似的算法。流程如下:
-
1.用户生成 ECDHE 公私钥,保存在本地。
-
2.将公钥发送到服务器,私钥保存在本地。
-
3.用户登录,获取所有好友信息的更新,包含每个好友的公钥。
-
4.发送消息,和接收消息时均采用自己的私钥+对方的公钥生成 ShareKey。
-
5.使用 ShareKey 生成 AES256 的密钥,进行加密和解密。
- 三、服务器数据库安全
- 服务器上的数据库做了防止人为篡改的处理:
-
1.数据库有签名字段。
-
2.服务器上生成 ECDSA 公私钥。
-
3.服务器代码中对数据库敏感字段,比如:password, userID, friend 等做增删改操作时均通过 ECDSA 生成签名,并更新到签名字段。
-
4.服务器代码对 password, userID, friend 等数据进行读取,判断等操作时进行
ECDSA验证签名,只有通过验证才能进行后续流程,否则给客户端报错。
-
5.服务端程序进行加密和签名保护。
- 四、密钥安全
-
1.用户的登录密码,二次密码,自动登录密码,均采用 SRP 算法,服务器上不存储用户的密码。
-
2.用户的加密私钥仅放在用户手机。
-
3.用户可随时在客户端上手动更新内容加密的密钥。
- 什么是公钥和私钥?
- 公开密钥(PubKey:简称公钥)和私有密钥(PriKey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。
- 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。如上文加密中使用的RSA、ECDHE为非对称加密算法。
- 非对称加密工作原理?
-
1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
-
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
-
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
-
4.A将这个消息发给B(已经用B的公钥加密消息)。
-
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个数据的人都无法解密,因为只有B才有B的私钥。