在我们真实企业开发中,用户数据的安全性与保密性是很重要的,因此会经常涉及到对数据的加密与脱敏。那么什么是加密与脱敏呢?它们的区别又是什么呢?
敏感数据的实际值转换为"非敏感"的值,只能通过解密还原成原始的值【双向】

脱去数据的敏感性,在一个不可逆转的过程中,敏感数据的真实值被转换为虚构的,但是看起来很逼真的值,原来的值被永久改变且无法恢复【单向】

对于开发、测试或者数据外发等场景,是不可能将生产上的真实数据暴露出来的,这个时候我们会
提供批量的脱敏数据。通过采样、替换等方式生成脱敏后的准真实数据库,脱敏后的数据同时保留
原有的关联关系。

在生产开发时,我们有时候需要让用户看到真实的数据,而有时候又不希望某些用户看到真实数据,这个时候就需要进行动态脱敏。
对需要共享的生产数据或时效性很高的数据测试和培训场景,基于网络代理模式的动态脱敏技术,达到实时模糊化敏感数据的效果。动态脱敏可以实现对业务系统数据库中敏感数据进行透明、实时脱敏。

【1】数据加密:
【2】数据脱敏:
如果要返回原始数据,代价相对较大,脱敏的规则要相当大。脱敏:在上图演示中,只是对数据如:姓名、电话号码等进行简单粗暴的脱敏处理,即改变真实数据
加密:通过加密算法进行处理,如MD5、DES加密等。
详细链接:https://www.cnblogs.com/fameg/p/9789496.html
finally块必须对资源对象、流对象进行关闭,有异常也需要做try-catch操作
"强制":JDK7以上,需要使用try-with-resources操作
我们以前的操作如下:
public class Demo01 {
public static void main(String[] args) throws FileNotFoundException {
FileReader fr = null;
try {
fr = new FileReader("D:\\javafiles\\java\\project\\test-git\\README.md");//创建FileReader对象
int i = 0;
System.out.println("文件内容如下:");
while ((i = fr.read()) != -1) {
System.out.println((char) i);//将读取内容强转为char类型
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fr != null) {
fr.close(); //关闭对象
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
try-with-resources语句是一种声明了一种或多种资源的try语句。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的资源在语句结束的时候都会被关闭。任何实现了java.lang.AutoCloseable接口的对象,和实现了java.io.Closeable接口的对象,都可以当做资源使用。
public class Demo01 {
public static void main(String[] args) throws FileNotFoundException {
try(FileReader fr = new FileReader("D:\\javafiles\\java\\project\\test-git\\README.md")){
int i = 0;
System.out.println("文件内容如下:");
while((i = fr.read()) != -1){
System.out.println((char) i);//将读取内容强转为char类型
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这样的写法既简洁,又不容易出错,更不会造成资源的浪费,因为不论是否有异常发生,资源最终都会被关闭
我们也可以在一个try-with-resources语句里面声明多个资源,资源之间用分号隔开:
public class Demo01 {
public static void main(String[] args) throws FileNotFoundException {
try(
FileReader fr = new FileReader("D:\\javafiles\\java\\project\\test-git\\README.md");
InputStream is = new FileInputStream("D:\\javafiles\\java\\project\\test-git\\README.md")
){
int i = 0;
System.out.println("文件内容如下:");
while((i = fr.read()) != -1){
System.out.println((char) i);//将读取内容强转为char类型
}
System.out.println("=============");
int j = 0;
System.out.println("第二次读取:");
while((j = is.read()) != -1){
System.out.println(j);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
不论上面代码是否会报异常,FileReader与InputStream的close方法都会自动声明的相反顺序调用,保证资源正常关闭。
详情:https://www.cnblogs.com/hihtml5/p/6505317.html
线程池不能使用Executors创建,而是通过ThreadPoolExecutor的方法,这样的处理方式可以让开发人员更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors返回的线程池对象弊端如下:
1. FixedThreadPool和SingleThreadPool:
允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM
2. CachedThreadPool和ScheduledThreadPool:
允许创建的线程数为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM