IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SpringBoot+数据库加密连接 -> 正文阅读

[大数据]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();
	}
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:03:34  更:2021-10-17 12:04:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:56:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码