jasypt使用
Jasypt可以用於配置文件加密。通常配置文件中存放有數據庫賬號密碼等敏感的輸入,如果被攻擊者通過任意文件讀取的漏洞訪問,那么這些敏感信息很容易泄露,因此對這些數據加密加強了系統的安全性。
Jasypt使用分為加密和解密兩部分。
- 加密可以通過執行CMD命令,調用jar包中的
JasyptPBEStrignEncryptionCLI
類來執行加密;也可以編寫測試代碼,在代碼中使用該jar包加密數據- 解密則需要在項目中進行相應的配置(詳細如下)
單數據源配置
-
pom.xml中引入jar包
<!--高版本需要增加配置--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency>
jasypt-spring-boot-starter
會依賴og.jasypt
並自動導入,從而無需手動導入該包 -
進入本地倉庫,找到
org.jasypt
包,並在該處打開cmd,輸入命令java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="123456" password="weaver" algorithm=PBEWithMD5AndDES
其中,啟動jar包后,調用了jasypt包中的
JasyptPBEStringEncryptionCLI
類,后邊包含有一些參數,分別是:input
待加密的字符串,password
鹽,algorithm
加密算法 -
將加密后的字符串替換原來的配置文件中的值,並用
ENC()
括起來。ENC()
是密文的標識符,可以通過 -
鹽同樣需要被加載到程序中,有三種方法:
-
在配置文件中增加配置:
jasypt.encryptor.password
。這樣會導致鹽暴漏,如果鹽泄露,攻擊者即可調用類JasyptPBEStringDecryptionCLI
進行解密 -
配置jvm參數。打成jar包,然后使用命令執行jar包時加上
由於springboot項目有內置的tomcat,因此可以直接打成jar運行
-
-
在spingboot啟動類中增加
@EnableEncryptableProperties
注解即可
多數據源配置
多數據源配置jasypt的過程和單數據源一樣,只是在項目中使用多數據源需要特殊配置。下面記錄springboot配置多數據源的過程。
-
在配置文件
application.yml
中,配置datasource部分增加多個數據源,並將賬號密碼加密spring: datasource: #數據源別名 db1: username: ENC(IiBb0EBtHkLZ4RnLNKs7gA==) password: ENC(vAVHrB7LxWluYT8KbGz+c7GOgTfRjegX) jdbc-url: jdbc:mysql://localhost:3306/shop?serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver db2: username: ENC(lG2v7QuwdQNwGuSDlLKeCA==) password: ENC(XIrMFS4fxYXeOJdN4/Vr+LJu6nh+Z9at) jdbc-url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/target?serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver
-
新建
DB1Config.java
和DB2Config.java
文件,里邊包含了對應配置文件中數據源的配置代碼DB1Config.java
@Configuration //basePackage后邊指定了哪些mapper文件要使用該數據源,當調用這些mapper時,會自動使用該數據源 @MapperScan(basePackages = "com.example.demo.mapper.db1.**",sqlSessionTemplateRef = "db1SqlSessionTemplate") public class DB1Config { @Primary // 表示這個數據源是默認數據源, 這個注解必須要加,因為不加的話spring將分不清楚那個為主數據源(默認數據源) @Bean("db1DataSource") @ConfigurationProperties(prefix = "spring.datasource.db1") //讀取application.yml中的配置參數映射成為一個對象 public DataSource getDb1DataSource(){ return DataSourceBuilder.create().build(); } @Primary @Bean("db1SqlSessionFactory") public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // mapper的xml形式文件位置必須要配置,不然將報錯:no statement (這種錯誤也可能是mapper的xml中,namespace與項目的路徑不一致導致) bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/*.xml")); return bean.getObject(); } @Primary @Bean("db1SqlSessionTemplate") public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
DB2Config.java
@Configuration @MapperScan(basePackages = "com.example.demo.mapper.db2.**",sqlSessionTemplateRef = "db2SqlSessionTemplate") public class DB2Config { @Bean("db2DataSource") @ConfigurationProperties(prefix = "spring.datasource.db2") //讀取application.yml中的配置參數映射成為一個對象 public DataSource getDb2DataSource(){ return DataSourceBuilder.create().build(); } @Bean("db2SqlSessionFactory") public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // mapper的xml形式文件位置必須要配置,不然將報錯:no statement (這種錯誤也可能是mapper的xml中,namespace與項目的路徑不一致導致) bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml")); return bean.getObject(); } @Bean("db2SqlSessionTemplate") public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }