MyBatis 配置文件 用户密码加密存储

文章目录

            • 1. 创建db.properties
            • 2. 配置mybatis-config.xml
            • 3. 加解密工具类
            • 4. 加解密依赖
            • 5. 创建SqlSessionFactoryUtil类
            • 6. db.properties加密后
            • 7. 常量类

实现原理:
在获取SqlSessionFactory之前,对获取的配置信息做解密操作

1. 创建db.properties

properties配置文件
一般是使用properties保存配置文件内容,然后在mybatis配置文件中进行读取
在resource文件下新建db.properties文件

# Oracle 数据库驱动
jdbc.driverClass=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.1.xxx.xxx:1521:orcl
jdbc.username=orcl
jdbc.password=orcl# Mysql数据库配置文件
#jdbc.driver = com.mysql.cj.jdbc.Driver
#jdbc.url = jdbc:mysql://192.1.xxx.xxx:3306/mybatis
#jdbc.username =user01
#jdbc.password =123456
2. 配置mybatis-config.xml

配置mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--引入外部properties文件  --><properties resource="com/gblfy/conf/db.properties"></properties><settings><!-- 打印查询语句 --><setting name="logImpl" value="STDOUT_LOGGING" /></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driverClass}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="com/gblfy/mapper/mapping/UserMapper.xml"/></mappers></configuration>
3. 加解密工具类

数据库密码加密
生产环境的数据库密码都为加密密码,需要在使用的时候,把加密密码解密成为明文
先创建数据库密码类

package com.gblfy.aes256.utils;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.Security;/*** AES加解密工具类** @author gblfy* @Date 2020-08-20*/
@SuppressWarnings("unused")
public class AES256Utils {/*** 密钥算法 java6支持56位密钥,bouncycastle支持64位*/public static final String KEY_ALGORITHM = "AES";/*** 加密/解密算法/工作模式/填充方式* <p>* JAVA6 支持PKCS5PADDING填充方式 Bouncy castle支持PKCS7Padding填充方式*/public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding";/*** 转换密钥** @param key 二进制密钥* @return Key 密钥*/public static Key toKey(String key) throws Exception {// 实例化DES密钥// 生成密钥byte[] raw = key.getBytes("ASCII");SecretKeySpec secretKey = new SecretKeySpec(raw, "AES");// SecretKey secretKey=new SecretKeySpec(key,KEY_ALGORITHM);return secretKey;}/*** 加密数据** @param data 待加密数据* @param key  密钥* @return byte[] 加密后的数据*/public static String encrypt(String data, String key) throws Exception {// 还原密钥Key k = toKey(key);/*** 实例化 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现* Cipher.getInstance(CIPHER_ALGORITHM,"BC")*/Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");// 初始化,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, k);// 执行操作byte[] encrypted = cipher.doFinal(data.getBytes());String enc = new BASE64Encoder().encode(encrypted);return enc;}/*** 解密数据** @param data 待解密数据* @param key  密钥* @return byte[] 解密后的数据*/public static String decrypt(String data, String key) throws Exception {// 欢迎密钥Key k = toKey(key);/*** 实例化使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现* Cipher.getInstance(CIPHER_ALGORITHM,"BC")*/Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 初始化,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, k);byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data);// 执行操作byte[] original = cipher.doFinal(encrypted1);String originalString = new String(original, "utf-8");return originalString;}public static void main(String[] args) throws UnsupportedEncodingException {String data2 = "123456";// 初始化密钥String skey = "KSDF692EB704D3FCDCEAD9F55FE97EGB";try {// 信息加密String decryptkey = AES256Utils.encrypt(data2, skey);System.out.println("加密后的key值:" + decryptkey);// 解密数据String data = AES256Utils.decrypt(decryptkey, skey);System.out.println("解密后的key值:" + data);} catch (Exception e) {e.printStackTrace();}}
}
4. 加解密依赖
    <!--SHA256Hex加密--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.13</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency>
5. 创建SqlSessionFactoryUtil类
package com.gblfy.util;import com.gblfy.consts.BaseConst;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Properties;/*** @author gblfy* 构建SqlSessionFactory* 由于数据库连接是宝贵的,需要对数据库连接统一管理,所以使用单例进行管理* 这里的单利使用的双重锁* SqlSessionFactory为线程不安全类型需要加锁,确保同一时刻,只有一个线程可以使用该对象*/
public class SqlSessionFactoryUtil {/*** SqlSessionFactory对象*/private static SqlSessionFactory sqlSessionFactory = null;/*** 类线程锁*/private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;/*** 单例*/private SqlSessionFactoryUtil() {}/*** @return SqlSessionFactory* 初始化SqlSessionFactory对象*/public static SqlSessionFactory initSqlSessionFactory() {// 获得输入流InputStream cfgStream = null;// 阅读流Reader cfgReader = null;InputStream proStream = null;Reader proReader = null;// 持久化属性集Properties properties = null;try {// 配置文件流 我这里配置文件做了特殊处理cfgStream = Resources.getResourceAsStream(BaseConst.MYBATIS_CONF);#配置文件在resource目录下面采用这种方式# cfgStream = Resources.getResourceAsStream("mybatis-config.xml");// 获得阅读流cfgReader = new InputStreamReader(cfgStream);// 读入属性文件 我这里配置文件做了特殊处理proStream = Resources.getResourceAsStream(BaseConst.MYBATIS_DB_CONF);#配置文件在resource目录下面采用这种方式#proStream = Resources.getResourceAsStream("db.properties");proReader = new InputStreamReader(proStream);// 持久化属性集properties = new Properties();// 流装载进入属性集合properties.load(proReader);// 获取当前系统ENVString key = "ASDF692EB704D3FCDCEAD9F55FE97EGB";
//            String key = System.getenv("DB_ENCRYPT_KEY");// 进行解密String encryptPwd = properties.getProperty("jdbc.password");properties.setProperty("jdbc.password", AES256Utils.decrypt(encryptPwd, key));
//            properties.setProperty("password", Decode.decryptDecode(properties.getProperty("jdbc.password"), key));} catch (Exception e) {e.printStackTrace();}if (sqlSessionFactory == null) {synchronized (CLASS_LOCK) {sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfgReader, properties);}}return sqlSessionFactory;}/*** 打开SqlSession** @return SqlSession*/public static SqlSession getSqlSession() {// 判空处理if (sqlSessionFactory == null) {initSqlSessionFactory();}return sqlSessionFactory.openSession();}//    /**
//     * 获取SqlSession
//     *
//     * @return
//     * @throws IOException
//     */
//    public static SqlSession getSqlSession() throws IOException {
//        //mybatis的配置文件
//        String resource = BaseConst.MYBATIS_CONF;
//        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
//        InputStream is = Resources.getResourceAsStream(resource);
//        //构建sqlSession的工厂
//        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//        return sessionFactory.openSession();
//    }public static void main(String[] args) {String key = System.getenv("DB_ENCRYPT_KEY");System.out.println("获取环境变量中的加密key: " + key);}}

注:如果配置文件都在resource目录下面,获取文件

6. db.properties加密后

接着,再次对密码进行加密,在读取的时候,对阅读流的结果集进行持久化设置
先对db.properties数据库密码进行加密
更改以后配置文件如下

# Oracle 数据库驱动
jdbc.driverClass=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.1.xxx.xxx:1521:orcl
jdbc.username=orcl
jdbc.password=15+fxnVIOd6h17zAg9vjEQ==# Mysql数据库配置文件
#jdbc.driver = com.mysql.cj.jdbc.Driver
#jdbc.url = jdbc:mysql://192.1.xxx.xxx:3306/mybatis
#jdbc.username = user01
#jdbc.password = 15+fxnVIOd6h17zAg9vjEQ==
7. 常量类
package com.gblfy.consts;public class BaseConst {public static final String MYBATIS_CONF= "com/gblfy/conf/mybatis-conf.xml";public static final String MYBATIS_DB_CONF= "com/gblfy/conf/db.properties";public static final String DB_ENCRYPT_KEY= "PBDF692EB704D3FCDCEAD9F55FE87EGB";public static final String DB_PWD_KEY= "jdbc.password";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

Kubernetes 项目作为容器编排领域的事实标准&#xff0c; 成功推动了诸如阿里云 Kubernetes &#xff08;ACK&#xff09;等云原生服务的迅速增长。但同时我们也关注到&#xff0c;Kubernetes 的核心 API 资源比如 Service、Deployment 等&#xff0c;实际上只是应用中的不同组…

今天的作业 --- 去重

使用Set的写法: public String myMethod1(String str){ //Set方法Set setnew HashSet();for (int i 0; i < str.length(); i) {set.add(str.charAt(i));}String s "";for (Object o :set) {so;}return s;}由于Set集合内不会存储重复的字符,所以…

2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态

《2020年国务院政府工作报告》提出&#xff0c;重点支持「两新一重」建设。其中「两新一重」中的第一个「新」&#xff0c;就是新基建&#xff0c;而人工智能是新基建的重要组成部分。新基建首次被纳入政府工作报告后&#xff0c;各大科技厂商纷纷押注&#xff0c;重金投向「新…

从零开始入门 K8s | Kubernetes 网络概念及策略控制

一、Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法。大家知道 Kubernetes 对于网络具体实现方案&#xff0c;没有什么限制&#xff0c;也没有给出特别好的参考案例。Kubernetes 对一个容器网络是否合格做出了限制&#xff0c;也就是 Kubernetes 的…

SwitchHosts

SwitchHosts 是一个管理、切换多个 hosts 方案的工具。 它是一个免费开源软件。 下载地址 https://github.com/oldj/SwitchHosts/releases

IO-Day1

一、File类的常用方法 File filenew File("D:\\abc"); //file表示的是文件夹 File file1new File("D:\\abc\\hello.txt"); //file1是文件 boolean exists file1.exists(); //是否存在这个文件 boolean isFile file1.isFile();…

开放计算架构:蚂蚁金服是如何用一套架构容纳所有计算的?

蚂蚁金服在过去十五年重塑支付改变生活&#xff0c;为全球超过十二亿人提供服务&#xff0c;这些背后离不开技术的支撑。在 2019 杭州云栖大会上&#xff0c;蚂蚁金服将十五年来的技术沉淀&#xff0c;以及面向未来的金融技术创新和参会者分享。我们将其中的优秀演讲整理成文并…

一个神秘URL酿大祸,差点让我背锅!

作者 | 编程技术宇宙责编 | Carol封图 | CSDN 付费下载自视觉中国神秘URL我叫小风&#xff0c;是Windows帝国一个普通的上班族。上一回说到因为一个跨域请求&#xff0c;我差点丢了饭碗&#xff0c;好在有惊无险&#xff0c;我的职场历险记还在继续。“叮叮叮叮~~~~”&#xff…

配置dns的三种方式

# 在网卡文件中修改echo DNS1"114.114.114.114" >> /etc/sysconfig/network-scripts/ifcfg-eth0 # 在主机表文件host文件中修改 echo "223.231.234.33 www.baidu.com" >> /etc/hosts # 在域名服务器中修改 echo nameserver 114.114.114.114 &g…

支付宝王益:40岁写30年代码是一种什么体验?

对于蚂蚁金服研究员王益而言&#xff0c;2019年是个颇有纪念意义的年份。今年他整40岁。从10岁开始&#xff0c;写代码整30年。这30年来&#xff0c;他当过“不务正业”的学生&#xff0c;创纪录地在大一就考下系统分析员&#xff0c;“单枪匹⻢”闯荡过从国内到硅谷的多家知名…

牛!2020年,这项技术将获得1,000,000,000元人民币注资!

在今年的特殊情况下&#xff0c;国外的AI明星公司轰然倒塌&#xff0c;一夜之间倒闭。又有某AI大厂一年亏了60亿……就像看破楼市一样&#xff0c;我们不由心想&#xff1a;“AI&#xff0c;会不会从头到尾就是一场泡沫&#xff1f;”但是&#xff0c;最近国家发的“定心丸”来…

Linux DNS | resolv.conf 配置dns解析,重启network丢失

文章目录1. 问题描述2. 重启网络后dns丢失3. 原因定位4. 关闭NetworkManager 服务5. 重新添加dns配置6. 测试验证1. 问题描述 在resolv.conf 配置文件中配置dns配置&#xff0c;偶尔出现DNS跌势的情况 例如&#xff1a; 在resolv.conf中配置百度的dns nameserver 114.114.114.…

基于阿里云的 Node.js 稳定性实践

前言 如果你看过 2018 Node.js 的用户报告&#xff0c;你会发现 Node.js 的使用有了进一步的增长&#xff0c;同时也出现了一些新的趋势。 Node.js 的开发者更多的开始使用容器并积极的拥抱 ServerlessNode.js 越来越多的开始服务于企业开发半数以上的 Node.js 应用都使用远端…

Knative 实战:基于阿里云 Kafka 实现消息推送

在 Knative 中已经提供了对 Kafka 事件源的支持&#xff0c;那么如何在阿里云上基于 Kafka 实现消息推送&#xff0c;本文给大家解锁这一新的姿势。 背景 消息队列 for Apache Kafka 是阿里云提供的分布式、高吞吐、可扩展的消息队列服务。消息队列 for Apache Kafka 广泛用于…

“编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力!

01从未得到过重视的问题一流程序员学数学&#xff0c;二流程序员学算法&#xff0c;低端看高端就是黑魔法。可能有人以为这就是个段子&#xff0c;但有过工作经验的都知道&#xff0c;这其实就是程序员的真实写照&#xff01;想一想&#xff0c;我们学习、求职、工作的场景中&a…

没有写入hosts文件权限

文章目录1. 效果图2. 现象3. 解决方案4. 赋予权限5. 成功截图1. 效果图 2. 现象 3. 解决方案 4. 赋予权限 5. 成功截图

6万人同时离场,竟然一点都不挤?原来用了这个神器

阿里妹导读&#xff1a;阿里20周年年会上&#xff0c;全球6万阿里人 "回家"&#xff0c;用一种特别的方式为阿里庆生。年会现场&#xff0c;每位阿里员工人手一只白色IoT手环&#xff0c;这个由102颗LED小灯组成的手环&#xff0c;随着现场音乐、节目节奏变幻不同色彩…

独家揭秘 | 阿里怎么做双11全链路压测?

阿里妹导读&#xff1a;全链路压测是阿里的首创&#xff0c;我们将从工作内容、操作过程、运行总结等多个方向来介绍下阿里内部典型电商活动&#xff08;如双11准备&#xff09;&#xff0c;以给大家展示一个完整的压测流程&#xff0c;帮助更多的企业和用户更好的完成性能测试…

读取模式错误,计算引擎操作复杂……面对Hadoop这些问题该如何应对?

作者 | Monte Zweben译者 | 天道酬勤&#xff0c;责编 | Carol封图 | CSDN 付费下载自视觉中国Apache Hadoop于2006年出现在IT领域&#xff0c;它使用商品硬件&#xff0c;为组织提供前所未有的数据量存储能力。不仅解决了数据集的大小问题&#xff0c;还解决了数据类型问题&am…

Nacos 集群集成SpringBoot2.x 微服务_02

文章目录一、SpringBoot2.x 微服务1. 依赖引入2. bootstrap.yaml配置3. 测试类二、nacos配置规则2.1. 登录nacos2.2. 配置规则三、测试验证3.1. 启动项目3.2. 验证一、SpringBoot2.x 微服务 1. 依赖引入 <parent><groupId>org.springframework.boot</groupId&g…