一、前言
1、问题
通常项目配置文件中的账号信息如下,都是直接暴露出来的,如果源码不小心泄露将会引起一系列安全问题…
2、解决
- 通过
配置中心
动态加载配置文件 - 通过
jasypt
加密组件进行加密
/解密
二、springboot
整合jasypt
加密
yml配置文件
1、pom.xml
中引入依赖
<!-- jasypt加密组件: https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2、application.yml
中配置加密密钥
# 配置加密密钥
jasypt:
encryptor:
password: zhengqing # TODO 这里密钥修改为自己的!!!
3、jasypt加密/解密测试类
public class JasyptTest {
@Test
public void test() {
// 对应配置文件中配置的加密密钥
System.setProperty("jasypt.encryptor.password", "zhengqing");
StringEncryptor stringEncryptor = new DefaultLazyEncryptor(new StandardEnvironment());
System.out.println("加密: " + stringEncryptor.encrypt("root"));
System.out.println("解密: " + stringEncryptor.decrypt("N/+f2B9SznK4MUDSp24Upw=="));
}
}
4、修改yml配置文件账号信息为加密方式
ex: root
-> ENC(N/+f2B9SznK4MUDSp24Upw==)
server:
port: 80
spring:
application:
name: demo
# =========================== ↓↓↓↓↓↓ 配置数据源 ↓↓↓↓↓↓ ===========================
datasource:
url: jdbc:mysql://127.0.0.1:3306/demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否进行SSL连接 解决则加上 &useSSL=false
name: demo
username: ENC(N/+f2B9SznK4MUDSp24Upw==)
password: ENC(N/+f2B9SznK4MUDSp24Upw==)
platform: mysql
driver-class-name: com.mysql.jdbc.Driver
# 配置加密密钥
jasypt:
encryptor:
password: zhengqing # TODO 这里密钥修改为自己的!!!
三、进阶
1、自定义加密标识
jasypt默认使用ENC()
来标识加密,加载配置的时候检测到ENC()
即会自动解密
下面我们来尝试自定义一个加密标识,JASYPT_ZQ()
application.yml
中新增如下配置:
jasypt:
encryptor:
property:
prefix: JASYPT_ZQ( # TODO 加密前缀
suffix: ) # TODO 加密后缀
password: zhengqing # TODO 加密密钥
2、将加密密钥
作为启动运行参数
以上我们的密钥也是保存在配置文件中的,一旦密钥泄露,信息被解密,安全隐患依然存在!
因此我们可以通过将密钥设置为程序启动时的参数来避免!!!
java -Djasypt.encryptor.password=zhengqing -jar app.jar
idea中如下配置运行:
3、自定义加密规则…
网上很多资源,可自行了解