建一個(gè)網(wǎng)站的技術(shù)解決方案seo優(yōu)化運(yùn)營(yíng)專員
?? 項(xiàng)目配置信息存放在哪?
在日常開發(fā)工作中,我們經(jīng)常需要使用到各種敏感配置,如數(shù)據(jù)庫(kù)密碼、各廠商的 SecretId、SecretKey 等敏感信息。
通常情況下,我們會(huì)將這些敏感信息明文放到配置文件中,或者放到配置中心中。
然而,這種做法存在嚴(yán)重的安全隱患!
🔞 安全措施有哪些?
- 使用環(huán)境變量替代明文配置信息
使用環(huán)境變量來替代配置文件中的明文敏感信息。在部署應(yīng)用程序時(shí),可以通過設(shè)置環(huán)境變量來傳遞敏感信息。 - 加密配置文件
使用對(duì)稱加密或非對(duì)稱加密來加密配置文件,以保護(hù)敏感信息。在加密配置文件時(shí),必須指定加密算法和密鑰,以及解密時(shí)使用的密鑰。 - 禁止將配置文件提交到代碼倉(cāng)庫(kù)!
為了防止配置文件泄露,應(yīng)該禁止將配置文件提交到代碼倉(cāng)庫(kù)中??梢詫⑴渲梦募砑拥?Gitignore 文件中,防止將其提交到代碼倉(cāng)庫(kù)中。 - 使用安全的存儲(chǔ)方式
如果將敏感信息存儲(chǔ)在配置文件中,應(yīng)該確保使用安全的存儲(chǔ)方式??梢詫⑴渲梦募鎯?chǔ)在受保護(hù)的目錄中,并限制訪問該目錄的權(quán)限。 - 限制訪問配置文件的權(quán)限!
限制可以訪問配置文件的用戶和進(jìn)程的權(quán)限,以防止未經(jīng)授權(quán)的用戶和進(jìn)程訪問配置文件。 - 審計(jì)配置文件的訪問記錄!
定期審計(jì)配置文件的訪問記錄,以檢測(cè)是否存在未經(jīng)授權(quán)的訪問。
🎯目標(biāo):
學(xué)會(huì)用Jasypt 庫(kù)來加密配置文件!
文章目錄
- ?? 項(xiàng)目配置信息存放在哪?
- 🔞 安全措施有哪些?
- 🎯目標(biāo):
- 學(xué)習(xí)步驟:
- 一、了解 Jasypt
- Jasypt(Java Simplified Encryption)庫(kù)
- 二、引入 Jasypt 依賴
- 建一個(gè)SpringBoot demo,引入 Jasypt 依賴(注意:這里只標(biāo) Jasypt 依賴,沒說不用其他的依賴哈)
- 三、實(shí)現(xiàn)加解密工具類 JasyptUtil
- 四、進(jìn)行一波單元測(cè)試
- 拿 "CSNZ" 這個(gè)字符串加密
- 得到的結(jié)果是:OJsBWVePwbelr5XKuWXhYw==
- 拿 "OJsBWVePwbelr5XKuWXhYw==" 這個(gè)字符串解密
- 得到的結(jié)果是:
- 五、敏感配置進(jìn)行加密處理
- 修改加密工具庫(kù),密鑰使用參數(shù)傳入
- 配置文件信息配置
- 啟動(dòng)類,讀取配置文件信息并打印
- 六、項(xiàng)目,啟動(dòng)!
- 傳入?yún)?shù)
- 大功告成!
學(xué)習(xí)步驟:
1、了解 Jasypt2、引入 Jasypt 依賴
3、實(shí)現(xiàn)加解密工具類 JasyptUtil
4、先進(jìn)行一波單元測(cè)試
5、敏感配置進(jìn)行加密處理
6、項(xiàng)目,啟動(dòng)!
一、了解 Jasypt
Jasypt(Java Simplified Encryption)庫(kù)
Jasypt 是一個(gè)開源的 Java 加密庫(kù),可以為應(yīng)用程序提供加密和解密功能
二、引入 Jasypt 依賴
建一個(gè)SpringBoot demo,引入 Jasypt 依賴(注意:這里只標(biāo) Jasypt 依賴,沒說不用其他的依賴哈)
<properties><jasypt-spring-boot-starter.version>3.0.4</jasypt-spring-boot-starter.version></properties><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>${jasypt-spring-boot-starter.version}</version></dependency>
三、實(shí)現(xiàn)加解密工具類 JasyptUtil
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.jasypt.properties.PropertyValueEncryptionUtils;
import org.jasypt.util.text.BasicTextEncryptor;
import org.springframework.beans.factory.annotation.Value;@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class JasyptUtil {/*** 加密時(shí)的密鑰*/private static String PRIVATE_KEY = "Evw3vbDt";private static final String PREFIX = "ENC(";private static final String SUFFIX = ")";private static BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();static {basicTextEncryptor.setPassword(PRIVATE_KEY);}/*** 明文加密*/public static String encrypt(String plaintext) {return basicTextEncryptor.encrypt(plaintext);}/*** 解密*/public static String decrypt(String ciphertext) {ciphertext = PREFIX + ciphertext + SUFFIX;if (PropertyValueEncryptionUtils.isEncryptedValue(ciphertext)) {String plaintext = PropertyValueEncryptionUtils.decrypt(ciphertext, basicTextEncryptor);return plaintext;}return "";}
}
四、進(jìn)行一波單元測(cè)試
拿 “CSNZ” 這個(gè)字符串加密
@Test
public void testEncrypt() {String encrypt = JasyptUtil.encrypt("CSNZ");System.out.println(encrypt);
}
得到的結(jié)果是:OJsBWVePwbelr5XKuWXhYw==
拿 “OJsBWVePwbelr5XKuWXhYw==” 這個(gè)字符串解密
@Test
public void testDecrypt() {String decrypt = JasyptUtil.decrypt("OJsBWVePwbelr5XKuWXhYw==");System.out.println(decrypt);}
得到的結(jié)果是:
五、敏感配置進(jìn)行加密處理
修改加密工具庫(kù),密鑰使用參數(shù)傳入
@Value("${jasypt.passKey}")
private static String PRIVATE_KEY;
配置文件信息配置
server:port: 8080encrypt:test:# 此處是密碼的密文(文中示例的就是CSNZ的密文),要用 ENC() 進(jìn)行包裹name: ENC(OJsBWVePwbelr5XKuWXhYw==)# 加密配置
jasypt:encryptor:# 指定加密密鑰,生產(chǎn)環(huán)境需要放到啟動(dòng)參數(shù)password: ${jasypt.passKey}# 指定解密算法,需要和加密時(shí)使用的算法一致algorithm: PBEWithMD5AndDES# 指定 initialization vector 類型iv-generator-classname: org.jasypt.iv.NoIvGenerator
啟動(dòng)類,讀取配置文件信息并打印
@SpringBootApplication
public class Application implements InitializingBean {public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Value("${encrypt.test.name}")private String name;@Overridepublic void afterPropertiesSet() throws Exception {System.err.println("程序啟動(dòng)...");System.out.println(name);}
}