Java 小案例:动态加载数据库信息

参考

Java 加密 - 掘金 (juejin.cn)

Java 读取配置文件 - 掘金 (juejin.cn)

环境搭建

创建application.properties,内容为数据库信息,账号密码已加密(加密参考开头链接)

ini 复制代码
# 测试数据库信息
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工具类,动态加载数据库信息

java 复制代码
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加密工具类

java 复制代码
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);
	    }

}

测试

设置当前环境为测试环境

设置当前环境为生产环境

相关推荐
customer0836 分钟前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
qq_4592384940 分钟前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端
灰色人生qwer44 分钟前
SpringBoot 项目配置日志输出
java·spring boot·后端
阿华的代码王国1 小时前
【从0做项目】Java搜索引擎(6)& 正则表达式鲨疯了&优化正文解析
java·后端·搜索引擎·正则表达式·java项目·从0到1做项目
EQUINOX11 小时前
lab4 CSAPP:Cachelab
java·后端·spring
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
一小路一1 小时前
Go Web 开发基础:从入门到实战
服务器·前端·后端·面试·golang
(; ̄ェ ̄)。2 小时前
在Nodejs中使用kafka(三)offset偏移量控制策略,数据保存策略
分布式·后端·kafka·node.js
paterWang2 小时前
基于SpringBoot的驾校报名小程序系统设计与实现(源码+文档)
spring boot·后端·小程序
苏生Susheng4 小时前
【SpringBoot整合系列】Kafka的各种模式及Spring Boot整合的使用基础案例
java·spring boot·后端·spring·kafka·消息队列·并发