Java 实现加密数据库连接的步骤

作者:月光中的污点

原文链接:https://www.extlight.com/2017/12/16/Java-%E5%AE%9E%E7%8E%B0%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5/

一、前言

在很多项目中,数据库相关的配置文件内容都是以明文的形式展示的,这存在一定的安全隐患。

在开发和维护项目时,不仅要关注项目的性能,同时也要注重其安全性。

二、实现思路

我们都知道项目启动时,Spring 容器会加载配置文件并读取文件中的内容,那么我们可以下边步骤操作:

通过 DES 算法加密连接数据库的账号和密码并将加密后的密文写到 db 配置文件中。

在 Spring 读取 db 配置文件时将密文解密回明文。

三、实现编码

3.1 加密工具类

DESUtil 类:

public class DESUtil {

 private static Key key;
 private static String KEY_STR = "myKey";
 private static String CHARSETNAME = "UTF-8";
 private static String ALGORITHM = "DES";

 static {
  try {
   KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
   SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
   secureRandom.setSeed(KEY_STR.getBytes());
   generator.init(secureRandom);
   key = generator.generateKey();
   generator = null;
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * 加密
  * @param str
  * @return
  */
 public static String getEncryptString(String str) {
  BASE64Encoder base64encoder = new BASE64Encoder();
  try {
   byte[] bytes = str.getBytes(CHARSETNAME);
   Cipher cipher = Cipher.getInstance(ALGORITHM);
   cipher.init(Cipher.ENCRYPT_MODE, key);
   byte[] doFinal = cipher.doFinal(bytes);
   return base64encoder.encode(doFinal);
  } catch (Exception e) {
   // TODO: handle exception
   throw new RuntimeException(e);
  }
 }

 /**
  * 解密
  * @param str
  * @return
  */
 public static String getDecryptString(String str) {
  BASE64Decoder base64decoder = new BASE64Decoder();
  try {
   byte[] bytes = base64decoder.decodeBuffer(str);
   Cipher cipher = Cipher.getInstance(ALGORITHM);
   cipher.init(Cipher.DECRYPT_MODE, key);
   byte[] doFinal = cipher.doFinal(bytes);
   return new String(doFinal, CHARSETNAME);
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}

通过上边的工具类对连接数据库的账号密码进行加密。笔者主机上连接数据库的账号和密码分别是 “root” 和 “tiger”。

经过加密后得到 “WnplV/ietfQ=” 和 “xyHEykQVHqA=” 。

db.properties 配置文件完整内容如下:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=UTC
jdbc.username=WnplV/ietfQ=
jdbc.password=xyHEykQVHqA=

3.2 配置文件解析类

EncryptPropertyPlaceholderConfigurer 类:

public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
 // 需要解密的字段
 private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };

 @Override
 protected String convertProperty(String propertyName, String propertyValue) {
  if (isEncryptProp(propertyName)) {
   // 解密
   String decryptValue = DESUtil.getDecryptString(propertyValue);
   return decryptValue;
  } else {
   return propertyValue;
  }
 }

 private boolean isEncryptProp(String propertyName) {
  for (String encryptpropertyName : encryptPropNames) {
   if (encryptpropertyName.equals(propertyName))
    return true;
  }
  return false;
 }
}

3.3 Spring 配置文件

applicationContext-mybatis.xml 部分内容:

<!-- <context:property-placeholder location="classpath:*.properties"/> -->

<bean class="com.light.ac.common.configuration.EncryptPropertyPlaceholderConfigurer">
 <property name="locations">
  <list>
   <value>classpath:db.properties</value>
  </list>
 </property>
 <property name="fileEncoding" value="UTF-8"/>
</bean>

未加密明文前,使用的是 <context:property-placeholder /> 加载 db 配置文件。

加密明文后,使用配置文件解析类加载 db 配置文件。

完成上述 3 个步骤后按照往常操作,直接运行项目即可。

四、总结

起初,在不了解实现思路前觉得这功能很神秘和高大尚。但是,理清思路后功能实现起来就非常简单了。

作为程序员不能被神秘的表象惊叹而“望而却步”,需要学会思考和理清思路,这样才能不断提升自身能力。

以上就是Java 实现加密数据库连接的步骤的详细内容,更多关于Java 实现加密数据库连接的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java连接数据库oracle中文乱码解决方案

    今天写了一个java项目连接数据库,之后写了一个执行入库操作的模块.此时暴露出一个问题就是项目的中文插入到数据库时会是乱码: 项目输出的中文: 执行插入操作后数据库中内容: 此时CustomerNumber字段是乱码. 出现这种情况一般都是数据库编码与项目编码不一致导致的,首先查看项目与数据库的编码格式: 查看项目编码: 项目的编码是gbk格式 查看数据库编码格式: 数据库编码格式是ISO-8859-1 以上查看编码格式操作可以百度 出现这种情况一般可以通过两种方式解决.一是修改数据库或者项目的

  • Java连接mysql数据库代码实例程序

    这篇文章主要介绍了java连接mysql数据库代码实例程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 用java 联接mysql的实例 在联接的时候,先确保本机安装了mysql或者服务器是安装了mysql import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; imp

  • Java之jdbc连接mysql数据库的方法步骤详解

    Java:jdbc连接mysql数据库 安装eclipse和mysql的步骤这里不赘述了. 1.一定要下jar包 要想实现连接数据库,要先下载mysql-connector-java-5.1.47(或者其他版本)的jar包.低版本的jar包不会出现时差问题的异常. 建议在下载界面点右边的"Looking for previous GA versions?"下载低版本的. https://www.jb51.net/article/190860.htm我看的是这个教程. 2.mysql前期

  • Java JDBC连接数据库常见操作总结

    本文实例总结了Java JDBC连接数据库常见操作.分享给大家供大家参考,具体如下: db.properties配置文件(MySql数据库) # db.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8 jdbc.username=root jdbc.password=123456 # param

  • 在IntelliJ IDEA中使用Java连接MySQL数据库的方法详解

    一.下载MySQL数据库并进行安装和配置 下载地址:https://dev.mysql.com/downloads/installer/ 二.下载JDBC连接器 下载地址:mysql-connector-java-8.0.22 下载好压缩包并解压后找到mysql-connector-java-8.0.22.jar文件放在自己指定的路径下. 三.在项目中导入jar包 用于测试数据库连接的测试类Test.java代码: import java.sql.Connection; import java.

  • Java使用JDBC连接postgresql数据库示例

    本文实例讲述了Java使用JDBC连接postgresql数据库.分享给大家供大家参考,具体如下: package tool; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class PsqlConnectionTool { p

  • Java连接数据库JDBC技术之prepareStatement的详细介绍

    一.prepareStatement 的用法和解释 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处. 3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, p

  • java 数据库连接与增删改查操作实例详解

    本文实例讲述了java 数据库连接与增删改查操作.分享给大家供大家参考,具体如下: 1.设置数据库的基本配置信息 package mysql; //数据库配置资源连接 public final class DbConfig { //数据库资源 指定所使用的数据库类型 地址 端口 数据库名称 编码格式 public final static String dbUrl = "jdbc:mysql://localhost:3306/database_name?useUnicode=true&c

  • java实现的连接数据库及模糊查询功能示例

    本文实例讲述了java实现的连接数据库及模糊查询功能.分享给大家供大家参考,具体如下: 模糊查询是比较常见的一种查询方式,例如在订单表中,包含有订单的具体日期.如果要查询某年某月的订单信息,最好的方式就是使用模糊查询.进行模糊查询需要使用关键字LIKE.在使用LIKE关键字进行模糊查询时,可以使用通配符"%",来代替0个或者多个字符,使用下划线_来代表一个字符. 注释:需要注意的是在使用LIKE的时候,后面的查询条件需要加 '  ',英文状态下的单引号引起来,不然报错如下 You ha

  • Java读取properties文件连接数据库的方法示例

    之前我们在入门jdbc的时候,常用这种方法连接数据库: package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { public static Connection getConnection() { Connection conn = null; try { Class.forName

  • Java连接数据库,及增删改查的示例

    自定义连接数据库的util类 package com.shuzf.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtil { // 定义驱动器类的路径 private static final String DRI

  • Java连接mysql数据库的详细教程(推荐)

    该教程是面向那些不知道如何通过java连接mysql数据库的新手,所以该教程用的方法不是最优的方法,但求是最好理解的方法. 需要的工具: eclipse.mysql.mysql的驱动 mysql驱动链接:mysql-connector-java-5.1.7.zip 如果该链接下载不了的话,可以私信我 1.在eclipse中创建一个工程:jdbc 2.在工程下创建lib文件夹 鼠标右键点击jdbc工程 --> New -->Folder. 文件夹命名为lib 3.导入mysql驱动 解压上述连接

  • java连接mysql数据库实现单条插入和批量插入

    本文实例为大家分享了java连接mysql数据库实现单条和批量插入的具体代码,供大家参考,具体内容如下 本文插入数据库的数据来源:java + dom4j.jar提取xml文档内容 1.连接数据库 package com.njupt.ymh; import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.Connection; public class Connect_MySQL { priv

  • java使用jdbc连接数据库简单实例

    本文为大家分享了java使用jdbc连接数据库的具体代码,供大家参考,具体内容如下 package com.tr.jdbc; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.commons.dbcp2.BasicDataSource; public class CollectionFac

随机推荐