加密文件忘记密码怎么解密_MyBatis 配置文件 用户密码加密存储

本文介绍了如何在MyBatis中配置properties文件来存储数据库连接信息,并展示了如何使用DES加密对数据库密码进行加密处理。在mybatis-config.xml中读取配置,通过Java实现加密和解密操作,确保生产环境中密码的安全。同时,利用操作系统环境变量来存储解密密钥,保证了密码解密的可行性。
摘要由CSDN通过智能技术生成

properties配置文件

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

在resource文件下新建db.properties文件

内容如下

# 数据库配置文件driver = com.mysql.cj.jdbc.Driverurl = jdbc:mysql:// /mybatisusername = password = 

然后,接着把文件放入源码包中

配置mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>

目录结构如下

dd534f120e00f741f664a9042b44f6f2.png

数据库密码加密

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

先创建数据库密码类

package com.ming.Util;import javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.io.UnsupportedEncodingException;import java.security.*;import java.util.Base64;public class Decode { /** * 生成秘钥 * @param * @return */ public static String generateDecode() throws UnsupportedEncodingException { KeyGenerator keyGen = null;//密钥生成器 try { keyGen = KeyGenerator.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } keyGen.init(56);//初始化密钥生成器 SecretKey secretKey = keyGen.generateKey();//生成密钥 byte[] key = secretKey.getEncoded();//密钥字节数组 // 进行base64编码 String encodedKey = Base64.getEncoder().encodeToString(key); return encodedKey; } /** * 进行加密 * @param string * @param key * @return */ public static String encryptionDecode(String string, String key){ //System.out.println(System.getenv("KEYWORDES")); SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢复密钥 Cipher cipher = null;//Cipher完成加密或解密工作类 try { cipher = Cipher.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } try { cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,加密模式 } catch (InvalidKeyException e) { e.printStackTrace(); } byte[] cipherByte = null; try { cipherByte = cipher.doFinal(Base64.getDecoder().decode(string));//加密data } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return Base64.getEncoder().encodeToString(cipherByte); } public static String decryptDecode(String string, String key){ SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢复密钥 Cipher cipher = null;//Cipher完成加密或解密工作类 try { cipher = Cipher.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } try { cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式 } catch (InvalidKeyException e) { e.printStackTrace(); } byte[] cipherByte = new byte[0];//解密data try { cipherByte = cipher.doFinal(Base64.getDecoder().decode(string)); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return Base64.getEncoder().encodeToString(cipherByte); }}

该类有三个方法,为加密data,解密data,生成key

然后编辑操作系统环境变量

达到输入

➜ ~ echo $KEYWORDES

可以输出环境变量

接着再次修改SqlSessionFactoryUtil类

package com.ming.Util;

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 org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.Reader;

import java.util.Properties;

/**

* @author ming

* 构建SqlSessionFactory

* 由于数据库连接是宝贵的,需要对数据库连接统一管理,所以使用单例进行管理

* 这里的单利使用的双重锁

* SqlSessionFactory为线程不安全类型需要加锁,确保同一时刻,只有一个线程可以使用该对象

*/

public class SqlSessionFactoryUtil {

/**

* SqlSessionFactory对象

*/

private static SqlSessionFactory sqlSessionFactory = null;

/**

* 类线程锁

*/

private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;

/**

* 日志管理类

*/

private static final Logger logger = LogManager.getLogger();

/**

* 单例

*/

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("mybatis-config.xml");

// 获得阅读流

cfgReader = new InputStreamReader(cfgStream);

// 读入属性文件

proStream = Resources.getResourceAsStream("db.properties");

proReader = new InputStreamReader(proStream);

// 持久化属性集

properties = new Properties();

// 流转载进入属性集合

properties.load(proReader);

}catch (Exception e){

logger.error(e);

}

if(sqlSessionFactory == null){

synchronized (CLASS_LOCK){

sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfgReader, properties);

}

}

return sqlSessionFactory;

}

/**

* 打开SqlSession

* @return SqlSession

*/

public static SqlSession openSqlSesion(){

// 判空处理

if(sqlSessionFactory == null){

initSqlSessionFactory();

}

return sqlSessionFactory.openSession();

}

}

接着,再次对密码进行加密,在读取的时候,对阅读流的结果集进行持久化设置

先对db.properties数据库密码进行加密

更改以后配置文件如下

# 数据库配置文件driver = com.mysql.cj.jdbc.Driverurl = jdbc:mysql://47.94.95.84:32786/mybatisusername = mybatispassword = 8GgwaJCtTXLGItiYF9c4mg==

接着再次更改Util类

package com.ming.Util;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 org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.util.Properties;/** * @author ming * 构建SqlSessionFactory * 由于数据库连接是宝贵的,需要对数据库连接统一管理,所以使用单例进行管理 * 这里的单利使用的双重锁 * SqlSessionFactory为线程不安全类型需要加锁,确保同一时刻,只有一个线程可以使用该对象 */public class SqlSessionFactoryUtil { /** * SqlSessionFactory对象 */ private static SqlSessionFactory sqlSessionFactory = null; /** * 类线程锁 */ private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class; /** * 日志管理类 */ private static final Logger logger = LogManager.getLogger(); /** * 单例 */ 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("mybatis-config.xml"); // 获得阅读流 cfgReader = new InputStreamReader(cfgStream); // 读入属性文件 proStream = Resources.getResourceAsStream("db.properties"); proReader = new InputStreamReader(proStream); // 持久化属性集 properties = new Properties(); // 流装载进入属性集合 properties.load(proReader); // 获取当前系统ENV String key = System.getenv("KEYWORDES"); // 进行解密 properties.setProperty("password
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值