theme: smartblue
参考
环境搭建
创建application.properties
,内容为数据库信息,账号密码已加密(加密参考开头链接)
```
测试数据库信息
db1.dev.dbname = dev_db db1.dev.username = MTN5u+gCyJI4zhXkJreKpA== db1.dev.password = Rlsy5KIMbP73BLKKWEvkPw==
生产数据库信息
db1.pro.dbname = pro_db db1.pro.username = MTN5u+gCyJI4zhXkJreKpA== db1.pro.password = wiv2NB5Tr24P0qKQTXerYg==
`` 创建
DBUtil`工具类,动态加载数据库信息
``` package demo1;
import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Properties;
public class DBUtil {
private static boolean isProduction() {
// 读取机器环境
String env = System.getenv("Env");
if("dev".equals(env)) {
// 测试环境
return false;
}
// 生产环境
return true;
}
private static String getInfo(String value) throws IOException {
InputStream inputStream = Main.class.getResourceAsStream("/application.properties") ;
Properties properties = new Properties();
properties.load(inputStream);
String property = properties.getProperty(value);
return property;
}
public static HashMap<String, String> getDBInfo() throws Exception {
// 判断当前环境
String env = isProduction()? "pro":"dev";
String dbname = "db1." + env + ".dbname";
String username = "db1." + env + ".username";
String password = "db1." + env + ".password";
HashMap<String, String> res = new HashMap<String, String>();
res.put("dbname", getInfo(dbname));
res.put("username",EncryptUtil.decrypt( getInfo(username)));
res.put("password", EncryptUtil.decrypt(getInfo(password)));
return res;
}
}
```
创建EncryptUtil
加密工具类
``` package demo1;
import java.nio.charset.StandardCharsets; import java.util.Base64;
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec;
public class EncryptUtil {
private static final String AES_ALGORITHM = "AES";
// AES加密模式为CBC,填充方式为PKCS5Padding
private static final String AES_TRANSFORMATION = "AES/CBC/PKCS5Padding";
// AES密钥为16位
private static final String AES_KEY = System.getenv("AES_KEY");
// AES初始化向量为16位
private static final String AES_IV = System.getenv("AES_IV");
/**
* AES加密
*
* @param data 待加密的数据
* @return 加密后的数据,使用Base64编码
*/
public static String encrypt(String data) throws Exception {
// 将AES密钥转换为SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
// 将AES初始化向量转换为IvParameterSpec对象
IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
// 根据加密算法获取加密器
Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
// 初始化加密器,设置加密模式、密钥和初始化向量
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
// 加密数据
byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
// 对加密后的数据使用Base64编码
return Base64.getEncoder().encodeToString(encryptedData);
}
/**
* AES解密
*
* @param encryptedData 加密后的数据,使用Base64编码
* @return 解密后的数据
*/
public static String decrypt(String encryptedData) throws Exception {
// 将AES密钥转换为SecretKeySpec对象
SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
// 将AES初始化向量转换为IvParameterSpec对象
IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
// 根据加密算法获取解密器
Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
// 初始化解密器,设置解密模式、密钥和初始化向量
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
// 对加密后的数据使用Base64解码
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
// 解密数据
byte[] decryptedData = cipher.doFinal(decodedData);
// 返回解密后的数据
return new String(decryptedData, StandardCharsets.UTF_8);
}
}
```
测试
设置当前环境为测试环境
设置当前环境为生产环境