安全性→互隐APP采用了哪些安全层级?
互隐APP采用了哪些安全层级?
通道加密
内容加密
服务器数据库安全
密钥安全
互隐APP加密方式详细信息
1. 通道加密
通道加密中采用了哪些加密算法?
通道加密中使用到的 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 会过期,过期后需要重新进行密钥协商。
2. 内容加密详解
互隐 非对称加密 如下:
(1) 用户生成 ECDHE 公私钥,保存在本地。
(2) 将公钥发送到服务器,私钥保存在本地。
(3) 用户登录,获取所有好友信息的更新,包含每个好友的公钥。
(4) 发送消息,和接收消息时均采用自己的私钥+对方的公钥生成 ShareKey。
(5) 使用 ShareKey 生成 AES256 的密钥,进行加密和解密。
互隐 双棘轮算法 如下:
Alice(A)发送的消息传送了她的新公钥。 最终,Bob(B)将收到以下消息之一,并执行第二个DH棘轮步骤; 在每个DH棘轮步骤中生成的DH 输出用于导出新的发送和接收链密钥。当各方轮流执行DH棘轮步骤时,他们轮流引入新的发送链,依此类推。
3. 服务器数据库安全
服务器上的数据库做了防止人为篡改的处理
(1) 数据库有签名字段。
(2) 服务器上生成 ECDSA 公私钥。
(3) 服务器代码中对数据库敏感字段,比如:password, userID, friend 等做增删改操作时均通过 ECDSA 生成签名,并更新到签名字段。
(4) 服务器代码对 password, userID, friend 等数据进行读取,判断等操作时进行 ECDSA验证签名,只有通过验证才能进行后续流程,否则 给客户端报错。
(5) 服务端程序进行加密和签名保护。
4. 密钥安全
(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的私钥。