java日志脱敏_java 日志脱敏框架 sensitive,优雅的打印脱敏日志

问题

为了保证用户的信息安全,敏感信息需要脱敏。

项目开发过程中,每次处理敏感信息的日志问题感觉很麻烦,大部分都是用工具类单独处理,不利于以后统一管理,很不优雅。

于是,就写了一个基于 java 注解的日志脱敏工具。

项目介绍

日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。

本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发。

用户也可以基于自己的实际需要,自定义注解。

日志脱敏

为了金融交易的安全性,国家强制规定对于以下信息是要日志脱敏的:

用户名

手机号

邮箱

银行卡号

密码

持久化加密

存储的时候上面的信息都需要加密,密码为不可逆加密,其他为可逆加密。

类似的功能有很多。不在本系统的解决范围内。

特性

基于注解的日志脱敏

可以自定义策略实现,策略生效条件

常见的脱敏内置方案

支持 jdk1.7+

快速开始

maven 导入

com.github.houbb

sensitive-core

0.0.1

定义对象

User.java

我们对 password 使用脱敏,指定脱敏策略为 StrategyPassword。(直接返回 null)

public class User {

@Sensitive(strategy = StrategyChineseName.class)

private String username;

@Sensitive(strategy = StrategyCardId.class)

private String idCard;

@Sensitive(strategy = StrategyPassword.class)

private String password;

@Sensitive(strategy = StrategyEmail.class)

private String email;

@Sensitive(strategy = StrategyPhone.class)

private String phone;

//Getter & Setter

//toString()

}

测试

@Test

public void UserSensitiveTest() {

User user = buildUser();

System.out.println("脱敏前原始: " + user);

User sensitiveUser = SensitiveUtil.desCopy(user);

System.out.println("脱敏对象: " + sensitiveUser);

System.out.println("脱敏后原始: " + user);

}

private User buildUser() {

User user = new User();

user.setUsername("脱敏君");

user.setPassword("123456");

user.setEmail("[email protected]");

user.setIdCard("123456190001011234");

user.setPhone("18888888888");

return user;

}

输出信息如下

脱敏前原始: User{username='脱敏君', idCard='123456190001011234', password='1234567', email='[email protected]', phone='18888888888'}

脱敏对象: User{username='脱*君', idCard='123456**********34', password='null', email='123**@qq.com', phone='188****8888'}

脱敏后原始: User{username='脱敏君', idCard='123456190001011234', password='1234567', email='[email protected]', phone='18888888888'}

我们可以直接利用 sensitiveUser 去打印日志信息,而这个对象对于代码其他流程不影响,我们依然可以使用原来的 user 对象。

自定义脱敏策略生效的场景

默认情况下,我们指定的场景都是生效的。

但是你可能需要有些情况下不进行脱敏,比如有些用户密码为 123456,你觉得这种用户不脱敏也罢。

UserPasswordCondition.java

@Sensitive(condition = ConditionFooPassword.class, strategy = StrategyPassword.class)

private String password;

其他保持不变,我们指定了一个 condition,实现如下:

ConditionFooPassword.java

public class ConditionFooPassword implements ICondition {

@Override

public boolean valid(IContext context) {

try {

Field field = context.getCurrentField();

final Object currentObj = context.getCurrentObject();

final String password = (String) field.get(currentObj);

return !password.equals("123456");

} catch (IllegalAccessException e) {

throw new RuntimeException(e);

}

}

}

也就是只有当密码不是 123456 时密码脱敏策略才会生效。

针对单个字段

上面的例子是基于注解式的编程,如果你只是单个字段。比如

singleSensitiveTest

@Test

public void singleSensitiveTest() {

final String email = "[email protected]";

IStrategy strategy = new StrategyEmail();

final String emailSensitive = (String) strategy.des(email, null);

System.out.println("脱敏后的邮箱:" + emailSensitive);

}

日志信息

脱敏后的邮箱:123***@qq.com

待优化的地方

全新对象创建

这种方式为了避免修改原始对象,创建了一个全新的对象,有点点浪费,可以优化。

其他方法

可以基于 log4j2/logback 等转换器进行敏感信息的脱敏,但是不具有不同的 log 框架的可移植性。

Springboot + SLF4j + Log4j2 打印异常日志时,耗时要5-6秒

1.使用jps -l 查看springboot项目的进程ID 2.使用命令jstack -l 进程ID > log.txt 打印堆栈信息到文件,内容如下: "http-nio-8065 ...

mybatis结合log4j打印SQL日志

mybatis结合log4j打印SQL日志 1.Maven引用jar包 默认的mybatis不能打印出SQL日志,不便于查看调试,须要结合log4jdbc-log4j2就能够完整的输入SQL的调试信息 ...

java 日志脱敏框架 sensitive-v0.0.4 系统内置常见注解,支持自定义注解

项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.编写起来又特别麻烦. 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 特性 基于注解的日志脱敏. 可 ...

java 日志脱敏框架 sensitive-新版本0.0.2-深度拷贝,属性为对象和集合的支持

项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.编写起来又特别麻烦. 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 用户也可以基于自己的实际需要, ...

Java日志脱敏框架 sensitive-v0.0.4 系统内置常见注解,支持自定义注解

项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.编写起来又特别麻烦. 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 特性 基于注解的日志脱敏. 可 ...

(网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)

转自CSDN: 前言 Logback是现在比较流行的一个日志记录框架,它的配置比较简单学习成本相对较低,所以刚刚接触该框架的朋友不要畏惧,多花点耐心很快就能灵活应用了.本篇博文不会具体介绍Logbac ...

Java日志系统框架的设计与实现

推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...

如何优雅地打印一个Java对象?

你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下). 在一个月黑风高的夜晚,我思前想后,觉得再也不能 ...

随机推荐

项目管理的一些Tip

最近带领了一个大概150人天的项目,做一些备注: 1, 知人善用. 排期分任务的时候,要先了解每个团队成员的特点,包括技术水平.性格,看他是适合做技术难度大的模块还是适合做业务逻辑复杂的模块. 2, ...

JVM之Class文件结构

每一个class文件对应一个类或者接口,但是一个类或者接口不一定生成class文件,classloader直接生成. 8为字节为基础的二进制流,各个数据项按照严格的顺序排列在class文件中,没有任何 ...

Ubuntu默认防火墙安装、启用、配置、端口、查看状态相关信息

Ubuntu附带了一个相对iptables简单很多的防火墙 配置工具:ufw ufw防火墙 即uncomplicated firewall,不复杂的防火墙,繁琐部分的设置还是需要去到iptables ...

允许FTP用户登录并禁止Shell登录的方法

最近安装了vsftpd做FTP服务,发现系统用户的登录shell设置为/sbin/nologin,就无法使用FTP服务.网上资料说,vsftpd会为每个FTP登录用户去在/etc/shells中检查对 ...

JavaScript学习汇总

对于JavaScript,还是无法割舍,有心无力,时间总是匆匆,暂且都放在这里吧 javascript中this的使用 写的很不错的一偏文章,简单看了下,mark了吧 原文:http://davids ...

HTTP各个状态返回值

转载来自于:http://desert3.iteye.com/blog/1136548 502 Bad Gateway:tomcat没有启动起来 504 Gateway Time-out: nginx ...

STL容器迭代器失效分析

连续内存序列容器(vector, string, deque) 对于连续内存序列STL容器,例如vector,string,deque,删除当前iterator会使得后面所有的iterator都失效, ...

PHP 中运用 elasticsearch

PHP扩展安装 1. 环境要求:PHP_VERSION >= 5.3.9,composer工具 2. 在E盘新建文件夹命名为elastic,,拷贝composer.phar到      E:/e ...

设计模式_Visitor_访问者模式

形象例子: 情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针 对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor, ...

MSSqlServer 主从同步复制原理(发布/订阅)

基本模型 1.发布类型: 快照发布:用于为事务复制和合并复制提供初始数据集:在适合数据完全刷新时也可以使用快照复制.利用这三种复制,SQL Server 提供功能强大且灵活的系统,以便使企业范围内的数 ...

你可能感兴趣的:(java日志脱敏)