温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在java中对日志的数据进行脱敏

发布时间:2021-05-24 18:18:38 来源:亿速云 阅读:639 作者:Leah 栏目:编程语言

怎么在java中对日志的数据进行脱敏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

思路

1。在 model层进行处理,直接重写get方法,在写一个getPlain 获取明文方法。(缺点:数据库写入和json序列化传递时使用的都是密文)

2.利用 日志组件过滤 特定的key,去进行脱敏(缺点:对所有的日志输出全部要正则匹配,非常耗时。)

由1,2的利弊,肯定会选择1,然后考虑一种实现(在model层定义方法,获取它的一个复制类,复制类里面的信息都是脱敏的,日志输出时只输出 复制对象),克服掉1的缺点 

1.定义接口类

public interface NoSensitiveObj<T> {  default T noSensitiveObj(){   return (T) this;  } }

2.实现类 如果这个类没有敏感信息,只实现 NoSensitiveObj ,不需要实现里面的方法

public class User implements NoSensitiveObj<User>{  private String name;    private String phone;    private String email;  public String getName() {   return name;  }  public void setName(String name) {   this.name = name;  }  public String getPhone() {   return phone;  }  public void setPhone(String phone) {   this.phone = phone;  }  public String getEmail() {   return email;  }  public void setEmail(String email) {   this.email = email;  }  @Override  public User noSensitiveObj() {    User t;    t=new User();    t.setEmail(SensitiveInfoUtils.email(email));    t.setName(SensitiveInfoUtils.chineseName(name));    t.setPhone(SensitiveInfoUtils.mobilePhone(phone));   return t;  }   }

3.工具类

public class SensitiveInfoUtils {  /**   * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>   */  public static String chineseName(final String fullName) {   if (StringUtils.isBlank(fullName)) {    return "";   }   final String name = StringUtils.left(fullName, 1);   return StringUtils.rightPad(name, StringUtils.length(fullName), "*");  }  /**   * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>   */  public static String chineseName(final String familyName, final String givenName) {   if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {    return "";   }   return chineseName(familyName + givenName);  }  /**   * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>   */  public static String idCardNum(final String id) {   if (StringUtils.isBlank(id)) {    return "";   }   return StringUtils.left(id, 3).concat(StringUtils     .removeStart(StringUtils.leftPad(StringUtils.right(id, 3), StringUtils.length(id), "*"), "***"));  }  /**   * [固定电话] 后四位,其他隐藏<例子:****1234>   */  public static String fixedPhone(final String num) {   if (StringUtils.isBlank(num)) {    return "";   }   return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");  }  /**   * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>   */  public static String mobilePhone(final String num) {   if (StringUtils.isBlank(num)) {    return "";   }   return StringUtils.left(num, 2).concat(StringUtils     .removeStart(StringUtils.leftPad(StringUtils.right(num, 2), StringUtils.length(num), "*"), "***"));  }  /**   * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>   *   * @param sensitiveSize   *   敏感信息长度   */  public static String address(final String address, final int sensitiveSize) {   if (StringUtils.isBlank(address)) {    return "";   }   final int length = StringUtils.length(address);   return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");  }  /**   * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com>   */  public static String email(final String email) {   if (StringUtils.isBlank(email)) {    return "";   }   final int index = StringUtils.indexOf(email, "@");   if (index <= 1) {    return email;   } else {    return StringUtils.rightPad(StringUtils.left(email, 1), index, "*")      .concat(StringUtils.mid(email, index, StringUtils.length(email)));   }  }  /**   * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>   */  public static String bankCard(final String cardNum) {   if (StringUtils.isBlank(cardNum)) {    return "";   }   return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(     StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));  }  /**   * [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号<例子:12********>   */  public static String cnapsCode(final String code) {   if (StringUtils.isBlank(code)) {    return "";   }   return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");  } }

4.测试

public class Test {  private static final Logger logger=LoggerFactory.getLogger(Test.class);    public static void main(String[] args) {   User user=new User();   user.setName("张三");   user.setPhone("18666218777");   user.setEmail("zhangsan@qq.com");   System.out.println(JSON.toJSONString(user.noSensitiveObj()));     } }

常用的java框架有哪些

1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。

关于怎么在java中对日志的数据进行脱敏问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI