为什么要对配备文件进行加密

先看一份典型的配备文件

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/user?serverTimezone=CTT&useSSL=false&allowPublicKeyRetrieL 4 7 } R 2 !val=true
    username: test
    password: 123456
  redis:
    host: 127.0.T  S # W ] 7 *0.1
    port: 6379
    password: 123456
...f $ ) , ? 0 N O p

像这样将项目的数据库暗码、redis暗码等直接写在项目中会有潜在的危险,比方项目源7 I q v码走漏,职工一不小心将公司源码上传到公有仓库,导致公司数据库暗码走漏。这时分对配备文件的要| k M ? v o l害信息进行加密就变得十分有必要了

jasypt 介绍

jasypt 是一个开源的工具包,f q ) u 3可以很便利的对 SpringBoot 配备文件中的配备项进行加密,保护重要数据,下面解说o y c 8 X一下 jasypt 的运用

ja 2 A X Z K Msypt 运用

引入依托

<dependency>
&} F / P I C X llt;groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependeq ( jncy>

生成加密字符串

已然需求对要害配备信息进行加密,就需求获取加密后的字符串,可以运用以下三种办法获取加密字符串

  • 经过 api 获取
public static void main(String[] args) {
BasicTextEncryptor textEncryptor = new BasicTextEE T L vncryptor();
// 加密密钥
textEncryptor.setPassword("ADUMb W UDFUOV7834*");
// 要加密的数据(如数据库的用户名或暗码)
String username = te* R :xtEncryptor.en. #   x (crypt("root");
String password = textEn w u l B Q } )cryptor.encrypt("123");
Sysn l i [tem.out.println("username:" + username);
System.out.println("passwork N 5d:" + password);
}

输出信息为:

username:ybOxTBF7SimOMLKlD7b3WA=J } R P _ % W S=
password:NTT9dRodj5y6) H f 6o+Ppq1rFsQ==
  • 履行 jar 获取
    如果你引入了jasypt-spring-boot8 Q S _-starter依托,可以在本地maven仓库的o: p 6 1 K crp q 6g/jasypt/jasypt/1.9.3途径下找到jasypt-1.9.3.jar这个 jar 包,可以直接运用这个 jar 对数据进行加密
java -cp ./jasypt-1.9.3.ja5 ) t % O 3r org.jasypt.intf.cli.JasyptPBE( H 9 d r StringEncryptionCLI pa0 * g Bssword="ADUMDFUOV7834*" algorithm=PBEWithMD` ] m 8 ,5AndDES input=root

输出信息为:

----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Sen S , (rver VM 25.231-b11
----ARGUMENTS-------------------
input: rT @ ( d a boot
algorithm: PBEWithMD5AndDES
password: ADUMDFUOV7u R 0834*
----OUTPUT----------------------
y7lANzmle3mXD2aiComkww==

OUTPUT 下面的就是加密后的字符串,这儿加密后的字符串与经过 api 获取的字符串不同,是因为PBEWithMD5AndDES算法每次的加密A y 1 3 P 8 –成果都不相同,对加密后的数据进行解密,仍是能解密出原始数据的

  • maven 插件办法生成加Q 1 1密字符串

添加f G O 8 C jasypt-maven-plugin

<build>
<plugins>
<plugin>
<group@ T ? Q NId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-mF Q ^ Z d u 3 b #aven-plugin</artifactId>
<version>3v 3 3 U H.0.3</version&gq U +t;
<c8 5 p & zonfiguration>
<path>file:src/main/resources/application.yml</path>
</configuration>k ! T
</plugin>
</pO ) S W ) ` E 9lugins>
&lC q l pt;/build>

DEC()包裹需求加密的字符

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1Q * P G  J r:3306/user?serverTimezone=CTT&useSSL=falX 9  g d Vse&allowPublicKeyRetrieval=true
    usern# y 2ame: DEC(test)
    password: DEC(1g z Y N R 2 ! w {23456)
  r. I T ? - Z 8 p seda ) G P R yis:
    host: 127.0.0.1
    port: 6379
    password: DEC(123)

履行指令

mvn jasypt:encrypt -Djasypt.encryptor.password="ADUMDFUOV$ x T I t n7834*"

当看到BUILD SUCCESS表明履行成功,再看application.yml文件,发现用DEC()包裹的配备现已成功加密了,而且前缀由DEC变成ENC

spring:
datasource:
driver-clD h ( O M @ [ 8ass-nameC k l 7 l 2 F: com.mysql% M $ N L W O &.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/user?serverTimezone=CTT&use# M t A RSSL=false&allowPublicKeyRetrieval=true
username: ENC(qU0YwDQ3Y+X8tyuw/HPJlUsCKgMj7Zk0F+z/9tCNNMPj R ;LsSD506TM/I8U9VyXf s r ` C ~GWN0)
password: ENC(du4DD H v d 3 X62bhnG] ~ G a 1 c ? tX8vcFQkamwfn/VzDLPwkmxWn4A1wyWu/e6pM0HfrOBc7lqd/vVGUEo)
redis:
host: 127.0.0.1
port: 6379
password: ENC(8yn4z61PwOJTXrpVx+iQVmJbsuNEQGLFVf5TDcnKKzsge4rmInCPMKUfqIIotyGc)

验证

到这儿就+ ? %现已完成对要害配备的加密2 a I S o | v B r进程,下面写一个简单的示例验证加密后的数据是否能精确解密

@RestControllerV P 8 Y
public class TestController {
@Value("${spring.datasource.password}")
private String databar v ` n HseUsername;
@Value("${spring.datasource.username}")
private String databasePassword;
@GetMapping("/getDatabaseInfo")
pu: M ~ & y b z &blic String getDatabaseInfo(){
return "username: " + databaseUsername + "," + "password: " + databasePassword;
}
}

工作项目,发现控制台报0 h A J 3错如下:

SpringBoot 使用 jasypt 对装备项进行加密

记住前面加密时用到的密钥吗ADUMDFUO@ e ` 9 VV7834*,解密的时分相同需求供给密钥才干正c 4 j常解密,咱们可以在 az , H +pplication.yml 中加入如下配备

jasypt.encryptor.password: ADUMDFUOV7834*

从头工作程序,浏览器访问lo_ | [ w b j ~ Bcalhost:8080/g[ ; q } W retDatF t & 0 Vabase- q D ^ * n XInfo,接口回来Q Z W | J ( u

username: 12345t & | j6,password: test

证明jasypt在加V T Y载配备的时分,会自动完成配备的解密进程,对加密后的配备进行解密

线上运用

可以看到,运用jasypt十分的便利,只需求引入依托,对需求的配备项进行加密即可,jasypt会自动的完成解密进程

但回到s f } 3开头,咱们加密配备项的目的是为了防止在X y P d 2 r Z A配备文件走漏的时分,把配备信息一起走漏出去。配备咱们是加密了,但密钥仍是保存在配备文件中,别人仍是能拿到密钥在解密出配备信息,这就相当于咱们把门给锁了,但是钥匙仍是插在锁上,所以需求将配备跟密钥分隔存储

  • 经过发起指令将密钥传给使用
java -jar demo.jar --Djasypt.encryptor.password=G H q P u Q"ADUMDFUOV7834*"
  • 经过环境变量的办法
#!/bin/bash
export ENCRYPTOR_PASSWORD=ADUMDFUOV7834*
java -jar -Djasypt.encryptor.p# } U W A ( q A gassword=$ENCRYPTOR_PASSWORD

jasypt项目地址:github.com/ulisesbocch…

扫码重视我
一起学习,一起进步

SpringBoot 使用 jasypt 对装备项进行加密