<!-- 典型明文配置 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="file:/opt/config/jdbc.properties"/>
</bean>
<!-- jdbc.properties -->
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.1.100:3306/prod_db
username=admin
password=P@ssw0rd123 <!-- 高風險!-->
配置文件一旦洩露(Git 誤提交、服務器入侵、備份文件流出),數據庫直裸奔運行環境。
┌──────────────┐ ┌─────────────────────┐ ┌──────────────┐
│ 應用啟動 │────▶│ CustomProperty │────▶│ 數據源 Bean │
│ 讀取加密配置 │ │ PlaceholderConfigurer│ │ 獲取解密值 │
└──────────────┘ │ 1. 讀取加密 properties
│ 2. 識別敏感 key
│ 3. 從安全存儲獲取明文
│ 4. 覆蓋屬性值
└─────────────────────┘
public class EncryptPropertyPlaceholderConfigurer
extends PropertyPlaceholderConfigurer {
// 敏感屬性名單
private static final Set<String> SENSITIVE_KEYS = Set.of(
"jdbc.url", "jdbc.username", "jdbc.password"
);
@Override
protected String convertProperty(String propertyName, String propertyValue) {
if (SENSITIVE_KEYS.contains(propertyName)) {
// 從安全中心獲取明文(示例:調用內部服務/讀取密文解密)
String decrypted = SecureConfigCenter.getDecryptedValue(propertyName);
if (decrypted != null) {
return decrypted; // 返回明文覆蓋佔位符
}
}
return super.convertProperty(propertyName, propertyValue); // 非敏感走默認邏輯
}
}
<bean class="com.example.config.EncryptPropertyPlaceholderConfigurer">
<property name="location" value="file:/opt/config/jdbc.properties"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
# jdbc.properties(可安全提交 Git、備份) jdbc.driver=com.mysql.jdbc.Driver jdbc.url=ENCRYPTED_PLACEHOLDER jdbc.username=ENCRYPTED_PLACEHOLDER jdbc.password=ENCRYPTED_PLACEHOLDER
| 方案 | 實現方式 | 安全等級 | 運維複雜度 | 適用場景 |
|---|---|---|---|---|
| 環境變量 | K8s Secret / Docker ENV / 系統環境變量 | ⭐⭐⭐ | 低 | 容器化部署、雲原生 |
| 配置中心 | Apollo / Nacos / Consul + 加密存儲 | ⭐⭐⭐⭐ | 中 | 微服務、動態刷新、審計 |
| 密碼管理器 | HashiCorp Vault / AWS Secrets Manager | ⭐⭐⭐⭐⭐ | 高 | 高合規要求、動態憑證輪換 |
| 對稱加密文件 | AES 加密 properties,啟動時解密 | ⭐⭐ | 低 | 單體應用、無配置中心 |