乐趣区

关于java:记一次数据脱敏的实践

数据安全是陈词滥调的问题了,很多时候开发人员在开发接口的时候,不知觉的状况下就把一些敏感信息透露进来,例如用户账号、手机号、身份证等,这样他人就能够调用接口抓取咱们的用户数据,导致隐衷信息透露。如果咱们能在数据库和利用零碎之间做一个脱敏,在数据从应用程序中流出之前将敏感性信息过滤掉,这样应用程序获取的数据曾经是脱敏后的数据了,它公布任何接口流出的都是通过脱敏后的数据,从而爱护咱们敏感数据不被泄露。之前和敌人聊过数据脱敏软件的实现,所以就应用 java 实现了一个繁难版本的脱敏程序,在这里记录一下。

指标

实现给处于运行中的利用系统脱敏,不影响零碎的失常运行,不批改利用零碎数据库中的数据

场景与计划

目前大多数的关系型数据库是 CS 模式的,数据库厂商提供驱动包给应用程序和数据库交互,应用程序和数据库之间通过驱动包应用 tcp+ssl 协定进行通信。鉴于此,我构想了两个计划来实现数据脱敏,欢送大家提供更多的思路,不甚感谢。

第一种是在服务端(数据库所在的服务器)做数据库插件实现脱敏;

第二种就是在客户端(应用程序)接到数据做脱敏工作。

集体比拟相熟 java 语言,实际时应用了第二种计划。接下来将对应用关系型数据库 java 应用程序做数据脱敏工作,当然实现思路也实用于应用其余类型数据库的利用零碎。具体计划如下图:

遇到的问题

在该计划中实际过程中,会遇到以下几个问题,如果有大佬已解决上面的几个问题,接下来的内容可不必看了,哈哈。

  • 一个客户的利用零碎,没有源代码的状况下怎么给零碎增加额定的逻辑代码
  • 脱敏逻辑在什么中央增加
  • 应用程序正在运行中,如何让代码失效运行

技术实现

首先,咱们先解决下面提到的问题,扫清技术阻碍。

对于第一个没有源代码的问题,尽管没有源代码然而会有字节码文件,咱们能够找到相应类的字节码,解析出类的办法从而在办法中增加逻辑,这就须要应用字节码的加强技术。字节码的加强有 ASM 和 Javassist,Javassist 是基于源码级别的 API,可读性强;ASM 是基于字节码。它们各有优劣,这里应用的是 ASM。

对于第二个问题,咱们晓得 java 中对数据库交互提供对立的标准,各个数据库厂商的驱动包实现该标准。而应用程序底层数据库交互均通过 jdbc 连贯数据库,所以咱们的脱敏逻辑只有在驱动包中增加好后就能够管控数据。既然咱们都能对字节码加强了,为什么不加强 socket 呢?如果加强要加强 socket 的话,就要实现数据的通信协定,还须要账号等。实现各个厂商的协定就是个微小的工作,如果咱们基于 jdbc 加强的话就省了这部分工作,实际上就是偷懒,哈哈。而 ResultSet 是 jdbc 查问数据返回后果集的接口,该接口返回的数据是曾经解析好的明文数据,只有加强治理好这个接口就能管制流出的数据。此次实际就是对 ResultSet 接口实现类进行加强解决,咱们的脱敏逻辑能够增加到 ResultSet 的实现类外面。此外当数据脱敏后流出之后,可能会被保留回来,所以还须要治理数据的流入还原脱敏前的数据。这就须要对 Statement、PrepareStatement 等接口的实现做加强。

对于第三个问题,这就须要 java agent 了,它能够帮忙咱们在利用启动后加载咱们加强后的类,让新增的脱敏逻辑运行失效。
java agent 有两种实现形式,一种是减少启动参数 -javaagent;

-javaagent:${agent.jar.path}/agent.jar

另外一种是应用 attach api,能够在运行时加载代理类。留神 attach api 在 tools 包中,须要增加这个包。命令格局如下:

${java_home}/bin/java -cp "${java_home}\lib\tools.jar;${attach.api.jar}" ${package.class.name} ${pid} ${agent.jar}

相干技术盘点:

- asm
- java agent
- java attach api

这样,只有 java 应用程序中应用实现了 jdbc 标准的数据库驱动包,咱们的脱敏程序就能够在这个 java 应用程序中失常工作。
以上就是整个的实现思路,实现的源码程序比较简单,就不再对代码一一赘述,接下来咱们间接看示例成果。

软件示例

咱们用 attach 的形式做示例,演示下给在运行中的利用零碎增加脱敏性能,另外一种也是相似的。示例链接点这里
次要步骤:

  1. 启动第三方利用零碎
  2. 筹备脱敏程序 jar 包
  3. 获取利用零碎的 pid,将脱敏程序 attach 到利用零碎
  4. 脱敏成果测试,留神不能影响利用零碎应用,脱敏开启后利用零碎失常应用,敞开后零碎也能失常应用

总结

示例展现了本次实现的数据脱敏程序,只须要晓得应用程序的过程 pid,就能够帮忙系统脱敏。以后的脱敏规反对能够依据关键字、正则表达式、字段名称脱敏,脱敏启用后利用可失常解决数据,不影响零碎应用,适用范围:实现了 jdbc 标准的 java 程序,自测 Mysql 和 Oracle 均能够应用。当然咱们还能够在此基础上扩大新的性能,比方减少 nlp 辨认出人名、手机号、身份证号进行脱敏,让脱敏更加主动、智能;反对更多的敏感词起源,包含数据库、redis 等。本文受集体思路限度,谬误脱漏之处,欢送大家斧正。

参考资料

  • 字节码加强
  • java 字节码指令大全
  • java 办法执行流程解析
退出移动版