1.设计思路
加密时机,入库前:拦截parameterhandler.setparameters,
解密时机,出库后,拦截resultsethandler.handleresultsets,
哪些字段要加密,配置化,指定表名,字段名
密文查询like查询,需要额外处理,密文无法like,
密文等值查询,需要先将查询参数加密后再对比
密钥管理,不硬编码,支持外部注入
2.拦截点选择
写入流程:Java对象------parameterhandler.setparameters(加密点)------perparedstatement------DB,
读取流程:DB------resultset------resultsethandler.handleresultsets(解密点)------Java对象
3.整体结构
table,field存储,用copyonwritearraylist,读多写少,原子替换,无并发问题
加解密实现,encryptplugin插件与decryptplugin插件,
加解密算法,aesencryptor(AES加解密),AES/ECB/PKCS5Padding
密钥存储外部文件读取注入,测试,预生产,生产,无泄密风险,(配置类spi机制注入,条件注解读取)
4.主要实现
配置加密,aes加解密器,入库拦截器,出库拦截器,查询条件拦截器(等值查询)自动配置类,自动配置类自动注入
5.关键问题解决
like模糊查询
密文无法like,,需要冗余字段方案,
增加明文摘要字段,取前四位或者后四位,加密时同时写入,查询时对前置匹配,先缩小范围,再在内存中匹配正常内容
范围查询
密文无法比较大小
增加明文分区字段,支持筛选分区,如年龄段20-30,30-40
表名,字段不明显
通过注解显示指定表名,字段,反射获取
密钥轮换
支持多密钥版本,存储map<string,secretkeyspec>keymap
使用typehandler与拦截器对比,
typehandler 拦截器
字段级精准控制,表级全局控制
xml需显式声明,业务代码零入侵
新增字段忘记声明则明文入库,配置表名字段即可
where条件也要typehandler,自动拦截加密,
适配少量敏感字段,多表多字段全局加密