SpringBoot配置文件敏感字段加密
一、Jasypt是什么
Jasypt是一个Java库,允许开发人员以很简单的方式添加基本加密功能,而无需深入研究加密原理。利用它可以实现高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件。
- 高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件…
- 集成Hibernate的。
- 可集成到Spring应用程序中,与Spring Security集成。
- 集成的能力,用于加密的应用程序(即数据源)的配置。
- 特定功能的高性能加密的multi-processor/multi-core系统。
- 与任何JCE(Java Cryptography Extension)提供者使用开放的API
说了这么多,我们spring boot 配置管理到底用Jasypt做什么?
- 出于安全考量,使用“密钥”加密敏感字符串(如数据库密码),并将加密后的字符串保存到配置文件中。
- spring boot集成Jasypt后实现加密字符串的自动解密配置值,不需要人为参与。当然spring boot需要密钥才能进行解密。
- “密钥”与配置文件分开存放,分开使用,从而保证应用配置的安全性
二、生成加密串
脚本生成加密串
为了方便,简单编写了一个bat脚本方便使用。
@echo off
set/p input=待加密的明文字符串:
set/p password=加密密钥(盐值):
echo 加密中......
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI ^
input=%input% password=%password% ^
algorithm=PBEWithMD5AndDES
pause
- 使用 jasypt-1.9.2.jar中的org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI类进行加密
- input参数是待加密的字符串,password参数是加密的密钥(盐值)
- 使用PBEWithMD5AndDES算法进行加密
注意:
jasypt-1.9.2.jar
文件需要和bat脚本放在相同目录下。此包可直接在示例项目中直接下载。
使用示例,双击上面的bat脚本文件,输入待加密内容和密钥,得到加密结果:
注意:相同的盐值(密钥),每次加密的结果是不同的。
工具类生成加密串
/**
* 对family.father.name进行加密
*/
@Test
public void tes4(){
//加密解密对象:默认是被springboot集成过来了,引入包就可以用。
BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();
//加密所需的salt(盐)
basicTextEncryptor.setPassword("123456");
//对family.father.name进行加密
String s = basicTextEncryptor.encrypt("happy family");
System.out.println(s);
}
/**
* 对family.father.name进行加密
*/
@Test
public void tes5(){
//加密工具
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
//加密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm("PBEWithMD5AndDES");//加密方式,默认PBEWithMD5AndDES,可改PBEWithMD5AndTripleDES
config.setPassword("123456");//加密所需的salt(盐)
//应用配置
encryptor.setConfig(config);
//对family.father.name进行加密
String s = encryptor.encrypt("zhoujinyuan");
System.out.println(s); //4R6l0dB4vAQtqmKO1L1Ywpl6YIsVKAwP
}
三、Jasypt与spring boot整合
首先引入Jasypt的maven坐标
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
在properties或yml文件中需要对明文进行加密的地方使用ENC()包裹,如原值:"happy family",加密后使用ENC(密文)
替换。程序中像往常一样使用@Value("${}")
获取该配置即可,获取的是解密之后的明文值。
文本被加密之后,我们需要告知Spring Boot该如何解密,因为Spring Boot要读取该配置的明文内容。在application.properties或yml文件中,做如下配置:
# 设置盐值(加密解密密钥),我们配置在这里只是为了测试方便
# 生产环境中,切记不要这样直接进行设置,可通过环境变量、命令行等形式进行设置。下文会讲
jasypt:
encryptor:
password: 123456
开始按照老师的测试的时候报错了
EncryptionOperationNotPossibleException
代码没问题
后来发现引入的Jasypt包的版本和我的SpringBoot2.4.0最新版冲突
把Jasypt改成了2.1.1就可以用了
四、“密钥”与配置文件分开存放
本身加解密过程都是通过盐值
进行处理的,所以正常情况下盐值
和加密串
是分开存储的。出于安全考量,盐值
应该放在系统属性
、命令行
或是环境变量
来使用,而不是放在同一个配置文件里面。
4.1 命令行存储方式示例
java -jar xxx.jar --jasypt.encryptor.password=xxx &;
4.2 环境变量存储方式示例
设置环境变量(linux):
# 打开/etc/profile文件
vim /etc/profile
# 文件末尾插入
export JASYPT_PASSWORD = xxxx
启动命令:
java -jar xxx.jar --jasypt.encryptor.password=${JASYPT_PASSWORD} &;
五、这样真的安全么?
有的同学会问这样的问题:如果的linux主机被攻陷了怎么办,黑客不就知道了密钥?
对于这个问题:我只能这么说,如果你的应用从内部被攻陷,在这个世界上没有一种加密方法是绝对安全的。这种加密方法只能做到:防君子不防小人。大家可能都听说过,某著名互联网公司将明文数据库密码上传到了github上面,导致用户信息被泄露的问题。这种加密方式,无非是将密钥与加密结果分开存放,减少个人疏忽导致的意外,增加破解难度。
如果密钥被从内部渗透暴露了,任何加密都是不安全的。就像你的组织内部有离心离德的人,无论你如何加密都不安全,你需要做的是把他找出来干掉,或者防范他加入你的组织!
原文:https://www.cnblogs.com/jinyuanya/p/13975457.html