SpringBoot+数据库配置 加密连接

1.引入依赖

<commons-io.version>2.8.0</commons-io.version>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>${commons-io.version}</version>
</dependency>

 

2. 写RSAUtil工具类, 包括3个方法
  • generateKeyToFile
  • decryptRSA
  • encryptRSA
import java.io.File;
import java.nio.charset.Charset;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import javax.crypto.Cipher;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

public class RSAUtil {

	static Logger logger = LoggerFactory.getLogger(RSAUtil.class);

	private static String algorithm = "RSA"; // 加密算法

	/**
	 * 生成密钥对并保存在本地文件中
	 *
	 * @param algorithm : 算法
	 * @param pubPath   : 公钥保存路径
	 * @param priPath   : 私钥保存路径
	 * @throws Exception
	 */
	public static void generateKeyToFile(String algorithm, String pubPath, String priPath) {

		try {
			KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);

			KeyPair keyPair = keyPairGenerator.generateKeyPair();

			PublicKey publicKey = keyPair.getPublic();
			PrivateKey privateKey = keyPair.getPrivate();

			byte[] publicKeyEncoded = publicKey.getEncoded();
			byte[] privateKeyEncoded = privateKey.getEncoded();

			String publicKeyString = Base64.getEncoder().encodeToString(publicKeyEncoded);
			String privateKeyString = Base64.getEncoder().encodeToString(privateKeyEncoded);
			// 保存公私钥到文件

			FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));
			FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));
		} catch (Exception e) {
			logger.warn(e.getMessage(), e);
		}

	}

	/**
	 * @param privateKey
	 * @param encrypted  : 密文
	 * @return : 明文
	 * @throws Exception
	 */
	public static String decryptRSA(String privateKey, String encrypted) {
		try {
			if (!StringUtils.hasText(encrypted)) {
				return "";
			}
			KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
			PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
			// 生成私钥
			PrivateKey key = keyFactory.generatePrivate(spec);

			// 加密
			Cipher cipher = Cipher.getInstance(algorithm);
			cipher.init(Cipher.DECRYPT_MODE, key);
			byte[] decode = Base64.getDecoder().decode(encrypted);
			byte[] bytes1 = cipher.doFinal(decode);
			return new String(bytes1);
		} catch (Exception e) {
			logger.warn(e.getMessage(), e);
			return "";
		}
	}

	/**
	 * @param publicKey
	 * @param input     : 明文
	 * @return :密文
	 * @throws Exception
	 */
	public static String encryptRSA(String publicKey, String input) throws Exception {
		try {
			if (!StringUtils.hasText(input)) {
				return "";
			}
			KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
			X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));

			PublicKey key = keyFactory.generatePublic(spec);

			// 加密
			Cipher cipher = Cipher.getInstance(algorithm);
			cipher.init(Cipher.ENCRYPT_MODE, key);
			byte[] bytes = cipher.doFinal(input.getBytes());
			return Base64.getEncoder().encodeToString(bytes);
		} catch (Exception e) {
			logger.warn(e.getMessage(), e);
			return "";
		}
	}
}

 

3. 生成private key, public key,加密url, username, password
  • 调用 RSAUtil.generateKeyToFile() 方法生成private key, public key
  • 调用 RSAUtil.encryptRSA() 把配置文件中的明文url, username, password加密
 
4.把pulic key, private key 和 加密后的url, username, password 写入配置文件
 
spring.datasource.url=encrypturl
spring.datasource.username=encryptusername
spring.datasource.password=encryptpassword


# RSA public key, private key
encrypt.private-key=        
encrypt.public-key=

 

 5.配置类
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataSourceConfig {

	@Value("${encrypt.private-key}")
	private String privateKey;

	@Value("${spring.datasource.url}")
	String jdbcUrl;

	@Value("${spring.datasource.username}")
	String username;

	@Value("${spring.datasource.password}")
	String password;

	@Bean
	public DataSource getDataSource() throws Exception {
		DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();

		dataSourceBuilder.url(RSAUtil.decryptRSA(privateKey, jdbcUrl));
		dataSourceBuilder.username(RSAUtil.decryptRSA(privateKey, username));
		dataSourceBuilder.password(RSAUtil.decryptRSA(privateKey, password));

		return dataSourceBuilder.build();
	}
}

 

posted on 2021-10-12 18:36  dreamstar  阅读(704)  评论(0编辑  收藏  举报