Post

AES/Base64防范数据泄露被盗用

前言

在日常业务中,经常会抓包查看APP的网络请求,如果一些重要信息虽然加密过了,但是如果出现过加密方式及数据被泄露难以防范别有用心的人使用脚本调用搞破坏,比如某个人拿到了你的mac地址及登录账号和密码,这样就可以模拟APP的正常请求而服务端无法识别到底是脚本还是正常的APP

解决方案:
将每次传递的mac都是变化的,而且传递的mac等信息还添加上时效性,比如有效期为3秒,这样就算别人拿到了你的信息也没法长期盗用

一、mac地址的传递
1、本地生成一个时间戳及随机数的秘钥
2、生成的秘钥使用第1步生成的秘钥进行AES加密,然后使用Base64的方式生成字符串
3、将第1步生成的秘钥使用一个前后端约定的生成的秘钥加密,比如当前日期和版本号或上线前下发的秘钥进行加密
4、将第2步和第3步的加密后的mac地址和加密后的秘钥传递给后端
5、后端收到请求后先通过约定的规则反向解密得到原生的秘钥,并验证秘钥的时间期限是否在约定的比如2秒返回内
6、使用解密得到的秘钥再对加密后的mac地址进行解密得到真正的mac地址

二、RSA秘钥
在第一步拿到mac地址后下发RSA秘钥

三、通过第二步拿到的RSA秘钥请求一般网络请求使用的AES秘钥
四、对第三步拿到的AES秘钥对一般请求进行加密解密
注意点:
1、在一些特殊核心业务,比如微信支付宝的发红包、转账、付款等场景时,对Mac的加密秘钥进行强时效性检查
2、发现某些版本的前后端约定的秘钥泄露后,及时更新一般秘钥,APP发一个新版本,被泄露版本的秘钥再请求一些核心接口及场景时,提示用户必须更新APP才能使用,这样就\可以防止出现一些大的损失

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
extension String {
      // 生成随机秘钥
      static func randomKey: String {
        return "时间版本每个版本发布前下发的秘钥等综合组成的变化的秘钥"
      }
      // 客户端的处理
     func encodeAESBase64(key: String) -> String {
        // 1、对字符串数据转换成Data
        guard let data = self.data(using: .utf8) else {
            return ""
        }
         // 2、对data进行AES加密
        let encodeData = `使用AES进行加密`
        // 3、将aes加密后的数据转换成base64字符串
        let base64Str = encodeData?.base64EncodedString()
        return base64Str ?? ""
    }
    // 模拟服务端收到后的处理
    func decodeAESBase64(key: String) -> String {
        // 1、对数据先进行base64还原成data
        guard let data = Data(base64Encoded: self) else {
            return ""
        }
       // 2、对数据进行AES解密
        guard let decodeData = `AES解密` else {
            return ""
        }
        // 3、对解密的数据还原成字符串
        let decodeStr = String(data: decodeData, encoding: .utf8)
        return decodeStr ?? ""
    }
}
This post is licensed under CC BY 4.0 by the author.