1. 为什么需要对接口数据加密?
最近,我们公司的项目上线后,发现了接口数据被抓取的记录,这才引起了注意,决定对数据进行加密传输。
这里有一个疑问,https能解决吗?实际上我们就是用的https协议,https本来也防护不了什么,手机上下个App,
就能把你手机上所有https卸载了,看到数据,因此还是要在数据层面加一层防护。
2. 有哪些加密方法?
主要有两大类:对称加密与非对称加密
对称加密:代表有AES, 只有一个密钥,加密解密用同一个。
非对称加密:代表有RSA,有公钥和私钥,私钥不能泄露。单向加解密,也就是:用公钥加密只能用私钥解密,用私钥加密只能用公钥解密。
注:为啥有了对称加密,还要有非对称加密
对称加密看起来比较好的实现了加密传输,但存在一个问题:如何安全的把密钥传输给对方?
为了实现密钥传输,于是,出现了公钥+私钥的模式,通过RSA公钥加密 AES密钥,传输给对方后,对方用私钥解密就拿到了AES密钥。私钥只有自己知道,保证了安全性。
那么问题来了,既然这样,为啥不直接使用公钥+私钥(非对称加密)来加密数据呢?
因为非对称加密基于复杂数学难题,运输速度很慢,加密数据的话,传输速度慢如乌龟、蜗牛,比AES要慢几个数量级。
所以我们大家耳熟能详的https就是采用 对称加密(用于加密数据)+非对称加密(用于传输密钥) 相结合的混合加密方式。
3. 实践方案?
至此,我们知道了 AES 和 RSA 可以实现加密传输,那么具体怎么做呢?
两种实现方案:
- 直接使用 AES 进行加解密,因为我们的接口服务,可以在后端把密钥写死,告诉前端即可,可以不涉及密钥传输问题。
- AES + RSA 相结合,这种方式多了一步,需要先把密钥加密后传输给后端,后端先解密 密钥,才能再解密数据。
我们公司使用的是第1种方案,在此也详细说明一下方案1,直接使用AES加解密。
注:AES加解密需要知道的事?
因为密钥只能加密固定长度的数据,然而我们要传输的数据长度是不固定的,于是就有了分组模式。
AES的分组模式主要有:ECB、CBC、CFB、OFB、CTR
其中ECB、CFB、OFB这三种模式已经不推荐使用,所以本文不做介绍,CBC和CTR是可以使用的。
CBC和CTR对比
模式 | 需要填充吗 | 安全吗 |
---|---|---|
CBC | 最后一个明文分组需要填充 | 三种算法:des/3des/aes,其中des已被证明可以暴力破解,3des性能太差 |
CTR | 不需要 | 只有aes算法,aes就是为了取代3des而出现,安全高,性能高 |
总结:推荐CBC模式和CTR模式,尤其是CTR模式,不需要填充,代码实现起来很方便。而且加密和解密的方法是一样的。
4. 代码实现?
接下来,用go语言实现CTR模式
// AES加密算法,key为密钥,长度只能是16、24、32字节, 用以选择AES-128、AES-192、AES-256。
func CryptCTR(src []byte, key []byte, ivs ...[]byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
// iv值,长度等于block块的大小
iv := []byte("ivlenthis16bytes")
if len(ivs) > 0 {
iv = ivs[0]
}
if len(iv) != block.BlockSize() {
return nil, errors.New("iv size must be equal blockSize")
}
// CTR模式不需要填充
stream := cipher.NewCTR(block, iv)
dst := make([]byte, len(src))
// CTR模式 加密 解密是同一个方法
stream.XORKeyStream(dst, src)
return dst, nil
}
怎么样,简单吧,这就是CTR模式,这个方法可以用于加密,也可以用于解密,试试吧。
5. 加密后怎样调试接口?
接口数据一旦加密,在报错的情况下,我们怎么定位错误呢,这里我讲一下怎么在加密的情况下调试接口。
// 第1步:将返回数据定义为以下对象
{
"code": code.Code(),
"data": resultData, // 只对此处的resultData加密
}
// 第2步:设计每个接口的code码,比如 101011,这6位数代表的意思:10 模块,10 某个控制器,11 报错位置
// 第3步:在错误处理时记录日志把code码一并记录,这样可以根据code码搜索日志查看报错信息
// 调用接口可以看到code码,根据code码定位到具体出错位置
以上就是本文所有内容啦
谢谢阅读