大家好,欢迎来到IT知识分享网。
1.背景
为了保障企业数据安全,信通院最近出台了数据安全管理认证,其中有一个审核条目是安全存储,要求将敏感字段在数据库加密存储,但是加密存储
会引发一个问题:如何查询,如何被第三方使用?
2.分析
我们可以一起分析一下具体的场景,我个人总结出如下几个:
1)某些字段,只加密,不做检索。
2)某些字段,加密后需要检索,但是只支持精准检索,不支持模糊检索。
3)某些字段,加密后需要检索,需要支持模糊检索,尽量保证性能。
3.实现策略
基于以上的场景,我从网上整理了以下策略:
1)场景1
如果只是加密,不做检索,这样的场景处理比较简单,如果业务需要明文,那么使用可逆加密算法;如果业务不需要明文,比如密码,那么使用不可逆加密算法即可。
2)场景2
场景2中,可以有两种处理方式,一个放在数据库,在插入的时候将字段加密;查询的时候,在sql对字段解密处理
INSERT INTO t_passwd VALUES (AES_ENCRYPT('明文1', 'key'), AES_ENCRYPT('text2', 'key'), AES_ENCRYPT('明文_text3', 'key'));
select * from t_user where AES_DECRYPT(UNHEX(mobile_no),'key') = '13312345678';
现在mysql8.0+版本支持函数索引,也可以具有高的查询性能。
当然,也可以使用数据库的加解密函数进行模糊查询,
3)场景3
场景3是我们面临最多的,也是最麻烦的,目前网上提供了一个思想:使用OPE加密算法,也就是保序加密算法,可以只是自定义的Base64做一个demo
首先,将加密的字段使用custom-base64加密,比如13312345678,产生一个index=MTMzMTIzNDU2Nzg=
然后,现在使用133作为模糊查询,可以再次使用算法custom-base64加密133,生成MTMz进行模糊匹配查询
对于OPE算法,目前我在网上只是找到实验版,生产的组件还未查询到。
java版本:https://github.com/ssavvides/jope
py版本:https://github.com/tonyo/pyope
另外一种方式可以采用分组加密方式,就是把原文进行拆分进行加密,在业务上进行分组进行模糊查询,其实是变种的场景2而已
-
如果商家输入 手机号18967038927查询
-
检索服务收到此请求,截取手机后八位 “67038927”
-
然后使用加密算法获取检索串 $ 7AnwZJ1e6BZc$
-
根据$ 7AnwZJ1e6BZc$ 到数据库表order_info中做一次查询即可,SQL 如下: Select * from order_info where 手机检索串 = ‘$ 7AnwZJ1e6BZc$’
参考文章:
1.https://open.taobao.com/docV3.htm?docId=106213&docType=1
2.https://www.jiamisoft.com/blog/6542-zifushujumohupipeijiamifangfa.html
3.http://blog.itpub.net/29773961/viewspace-2142305/
4.https://juejin.cn/post/6844903736792317960
5.https://blog.csdn.net/u012516914/article/details/114422156
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/32732.html