要完成properties属性文件某些属性值的加密,和读取属性文件时进行解密,需要4个步骤

  1. 编写加密解密工具类
  2. 手动通过加密解密工具类获得加密后的属性值密文,并把密文填写在properties文件中
  3. 编写PropertyPlaceholderConfigurer的子类,重写convertProperty()方法
  4. spring-dao.xml配置文件中配置PropertyPlaceholderConfigurer

接下来我们将拿配置数据库的properties文件进行举例(一般我们需要对用户名和密码进行加密)

编写加密解密工具类

在编写工具类前我们需要导入包含Base64这个类的依赖

<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version>
</dependency>

之所以要使用Base64对加密后的byte数组进行编码,可以参考Base64编码及其作用

编写使用DES加密算法的加密解密工具类

package com.lxc.o2o.util;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import org.apache.commons.codec.binary.Base64;/*** DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。* */
public class DESUtil {// 秘钥对象private static Key key;// 设置密钥keyprivate static String KEY_STR = "myKey";// 使用的编码private static String CHARSETNAME = "UTF-8";// 设置使用DES算法(我们这里主要使用java的DES算法)private static String ALGORITHM = "DES";// 初始化秘钥对象keystatic {try {// 生成DES算法对象KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);// 运用SHA1安全策略SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");// 设置上密钥种子secureRandom.setSeed(KEY_STR.getBytes());// 初始化基于SHA1的算法对象generator.init(secureRandom);// 生成密钥对象key = generator.generateKey();generator = null;} catch (Exception e) {throw new RuntimeException(e);}}/*** 获取加密后的信息* * @param str* @return*/public static String getEncryptString(String str) {try {// 按UTF8编码byte[] bytes = str.getBytes(CHARSETNAME);// 获取加密对象Cipher cipher = Cipher.getInstance(ALGORITHM);// 初始化密码信息,Cipher.ENCRYPT_MODE为加密类型cipher.init(Cipher.ENCRYPT_MODE, key);// 加密byte[] doFinal = cipher.doFinal(bytes);// 基于BASE64编码,接收byte[]并转换成String// byte[]to encode好的String并返回,编码成字符串返回return Base64.encodeBase64String(doFinal);} catch (Exception e) {// TODO: handle exceptionthrow new RuntimeException(e);}}/*** 获取解密之后的信息* * @param str* @return*/public static String getDecryptString(String str) {try {// 基于BASE64编码,接收byte[]并转换成String// 将字符串decode成byte[],解码操作byte[] bytes = Base64.decodeBase64(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) {// TODO: handle exceptionthrow new RuntimeException(e);}}public static void main(String[] args) throws UnsupportedEncodingException {System.out.println(getEncryptString("root"));System.out.println(getEncryptString("123456"));}}

获取用户名和密码的秘文

通过上面编写的DESUtil获取用户名和密码的密文,再把密文填写进jdbc.properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/myo2o?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
jdbc.username=WnplV/ietfQ=
jdbc.password=QAHlVoUc49w=

编写PropertyPlaceholderConfigurer的子类

package com.lxc.o2o.util;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
/*** 获取解密后的属性值*/
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {// 需要加密的字段数组(这里整个jdbc属性文件,我们只对username和password加密了)private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };/*** 对关键的属性进行转换,重写PropertyPlaceholderConfigurer中的convertProperty方法* 这个函数会对属性文件中所有的属性键值对进行读取*/@Overrideprotected String convertProperty(String propertyName, String propertyValue) {// 判断属性值是否被加密了if (isEncryptProp(propertyName)) {// 对已加密的字段进行解密工作String decryptValue = DESUtil.getDecryptString(propertyValue);return decryptValue;} else {// 如果没被加密,直接返回return propertyValue;}}/*** 判断该属性是否已加密,主要拿传进来的属性名和上面我们定义的需要加密的字段数组进行比对* * @param propertyName* @return*/private boolean isEncryptProp(String propertyName) {// 若等于需要加密的field,则进行加密for (String encryptpropertyName : encryptPropNames) {if (encryptpropertyName.equals(propertyName))return true;}return false;}
}

配置Bean

spring-dao.xml配置文件中配置我们自己实现的EncryptPropertyPlaceholderConfigurer

<!--连接数据库时,会自动读取对应的配置文件,并进行解密操作-->
<bean class="com.lxc.o2o.util.EncryptPropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:jdbc.properties</value><!-- 如果要读取其他加密的配置文件,继续配置在这个list中 --></list></property><property name="fileEncoding" value="UTF-8"></property>
</bean>

运行时创建了上面的bean后,可以直接通过${属性名}获取解密后的属性值

<!-- 2.数据库连接池  -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!--配置连接池属性 --><property name="driverClass" value="${jdbc.driver}"></property><property name="jdbcUrl" value="${jdbc.url}"></property><property name="user" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property>
</bean>
12345678

到这里我们就完成了加密和解密properties文件的所有操作

properties配置文件的加密相关推荐

  1. php 配置文件加密工具类,SpringBoot集成Jasypt安全框架以及配置文件内容加密(代码示例)...

    本篇文章给大家带来的内容是关于SpringBoot集成Jasypt安全框架以及配置文件内容加密(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们在SpringBoot项 ...

  2. Spring Boot 配置文件密码加密方法

    参考:https://github.com/ulisesbocchio/jasypt-spring-boot Spring Boot 配置文件密码加密两种方案 - ken007 - 博客园 1.引入j ...

  3. 【Quartz】解密properties配置文件中的账号密码

    在配置quartz时,为了保密某些信息(特别是账号密码),通常会使用密文.那么在实际使用这些配置信息时,需要进行解密.本文提供一种解密方法如下: (1)假设在properties文件中加密了账号密码 ...

  4. spring boot配置文件自定义加密配置

    公司漏洞检测,检测到 线上的jar包中配置文件里面数据库密码 ,redis密码等等配置都是明文,所以需要在配置文件中加密.所以为了实现该功能直接贴代码 贴一下原作者的git(原文章忘记在哪里了),感谢 ...

  5. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

  6. Java读取Properties配置文件

    目录 1.Properties类与Properties配置文件 2.Properties中的主要方法 3.示例 1.Properties类与Properties配置文件 Properties类继承自H ...

  7. Java 读写Properties配置文件

    转自:https://www.cnblogs.com/xudong-bupt/p/3758136.html 1.Properties类与Properties配置文件 Properties类继承自Has ...

  8. 因缺失log4j.properties 配置文件导致flume无法正常启动。

    因缺失log4j.properties 配置文件导致flume无法正常启动 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.报错:log4j:WARN No appenders ...

  9. idea中properties配置文件没有代码提示及代码高亮问题解决方案

    idea中properties配置文件没有代码提示及代码高亮问题解决方案 参考文章: (1)idea中properties配置文件没有代码提示及代码高亮问题解决方案 (2)https://www.cn ...

最新文章

  1. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令
  2. java队列研究_辨证论治失眠疗效评价的医生队列研究
  3. 外省籍进城务工人员随迁子女在浙江就地升学政策出台
  4. 杂谈:微服务的体系结构评审的三个问题
  5. [C#1] 10-事件
  6. 等了半个多月的悟空宝终身寿险
  7. O’Reilly发布“微服务成熟度状态”报告:微服务是成功的
  8. DataWorks搬站方案:Airflow作业迁移至DataWorks
  9. ThinkPHP php 仿千图网源码_PHP微信表白墙源码 基于ThinkPHP框架开发
  10. linux 传真 邮件,如何在Linux环境下架设一台传真服务器(2)
  11. 基于Hbase的用户评分协同过滤推荐算法
  12. ROS与Arduino学习(六)Logging日志
  13. 深入浅出WPF之Binding的使用(二)
  14. java监听焦点事件_【Java Swing公开课|Java Swing焦点事件监听器怎么用,看完这篇文章你一定就会了】- 环球网校...
  15. Facebook广告投放有什么策略?
  16. [转]关于jQuery性能优化
  17. element ui输入地内容明明符合规则还是校验报错
  18. 点云处理学习笔记(八)-- 点云配准
  19. oracle11g dbf恢复数据库,dbf文件如何恢复数据库
  20. 微博相册一键批量下载 Chrome 扩展

热门文章

  1. 哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略
  2. cdn节点人少延迟高_让你刷剧一直爽,CDN原理是什么
  3. 家装强电弱电布线图_关于你不知道的弱电改造详解 提早了解好做准备
  4. [转载] 微服务安全和治理
  5. olap 多维分析_OLAP(在线分析处理)| OLAP多维数据集和操作
  6. java printwriter实例_PrintWriter做过滤流+FileWriter案例分析
  7. 判断dll是版本(Debug Or Release)[测试通过]
  8. C++总结篇(4)内存管理
  9. 局域网在线监控设备扫描工具V1.0软件说明
  10. MFC串口通信设置及发送、中断接收程序