目录
需求
最近对我们的项目进行安全优化,我们的服务程序在使用过程中会持续接受客户端的一些数据并追加写到文件中,文件写入完毕后还支持客户端的随机访问来获取这些结构化信息。之前数据的写入都是明文方式,因此考虑使用最广泛使用的AES对称加密来进行处理,我们想到了两种方式进行:1)写入完毕后另起一个线程/进程读文件->加密->写文件->删除旧文件。2)写入数据时就进行加密。第一种方式虽然简单,但是在加密完成前还是存在泄露的风险,因此我们选择第二种方法进行。在实现中发现有以下难点:1)当前加密大都是对完整数据进行,缺少动态数据的加密。2)解密时因为要支持随机访问,所以解密要支持从任何位置的任意长度解密。在对AES的加密学习了解的基础上,最终解决这些问题,在此进行记录。
AES加密
AES加密及模式的学习参考了下面两篇文章:
- 一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现:https://juejin.cn/post/7030953914509836296
- AES的CTR模式加密解密详解:AES的CTR模式加密解密详解 | Wuman's Blog
其中支持从任意字节解密的模式有ECB、CBC、CFB和CTR,但是ECB不能抵抗重放攻击进行排除,而CBC、CFB在解密时都需要知道前一个分组的密文,在对文件进行随机访问时这需要往前多读取一些数据,使用不方便进行排除,最终只剩下CTR模式。