Spring 配置数据库用户名密码加密

2023-10-27

 

Spring 配置数据库用户名密码加密

传统形式配置数据库用户名密码

对于一般的spring框架,经常要用到数据源配置,如果是用xml配置的话,一般都是如下形式

 

数据库用户名密码密文配置实现

现在的需求是不能在配置文件里明文配置数据库用户名和密码

新增密文属性文件

class目录新增jdbc.properties配置文件,里面配置数据库用户名和密码的密文

修改spring数据库配置为占位符

修改spring数据库配置,如下

引入密文配置文件jdbc.properties

并在spring文件开头中加入如下配置,引入jdbc.properties文件

<bean id="propertyConfigurer"
		  class="com.ai.common.util.EncrypPropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
			</list>
		</property>
</bean>

自定义spring属性占位符处理类

EncrypPropertyPlaceholderConfigurer为自定义的,实现spring读取配置文件中的占位符,并且解析,注入解密后的数据库用户名和密码

public class EncrypPropertyPlaceholderConfigurer extends
        PropertyPlaceholderConfigurer {
    private Logger log= Logger.getLogger(EncrypPropertyPlaceholderConfigurer.class);

    @Override
    protected void processProperties(
            ConfigurableListableBeanFactory beanFactoryToProcess,
            Properties props) throws BeansException {
        String username = props.getProperty("jdbc.username");
        if (username != null) {// 将加密的username解密后塞到props
            String user = SymmetricEncoder.AESDncode(username);
            props.setProperty("jdbc.username", SymmetricEncoder.AESDncode(username));
        }
        String password = props.getProperty("jdbc.password");
        if (username != null) {
            props.setProperty("jdbc.password",
                    SymmetricEncoder.AESDncode(password));
        }
        super.processProperties(beanFactoryToProcess, props);
    }

    public static void main(String[] args) {
        String user="7Z3ekkmGFkOFjfpkNvg4cA==";
        System.out.println(AESCoderUtils.AESDncode(user));

    }

}

 

自定义AES加密解密算法

加密解密工具类

/**
 * <p>description:</p>
 *
 * @author tanggao
 * @version 1.0
 * @date 2018/10/18
 */
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

/*
 * AES对称加密和解密
 */
public class SymmetricEncoder {
    /*
     * 加密
     * 1.构造密钥生成器
     * 2.根据ecnodeRules规则初始化密钥生成器
     * 3.产生密钥
     * 4.创建和初始化密码器
     * 5.内容加密
     * 6.返回字符串
     */
    public static String AESEncode(String content){
        try {
            // 初始化算法,设置成“SHA1PRNG”是为了防止在linux环境下随机生成算法
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed("xxx".getBytes("utf-8"));
            //1.构造密钥生成器,指定为AES算法,不区分大小写
            KeyGenerator keygen=KeyGenerator.getInstance("AES");
            //2.根据ecnodeRules规则初始化密钥生成器
            //生成一个128位的随机源,根据传入的字节数组
            keygen.init(128, secureRandom);
            //3.产生原始对称密钥
            SecretKey original_key=keygen.generateKey();

            //4.获得原始对称密钥的字节数组
            byte [] raw=original_key.getEncoded();
            //5.根据字节数组生成AES密钥
            SecretKey key=new SecretKeySpec(raw, "AES");

            //6.根据指定算法AES自成密码器
            Cipher cipher=Cipher.getInstance("AES");
            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
            cipher.init(Cipher.ENCRYPT_MODE, key);
            //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
            byte [] byte_encode=content.getBytes("utf-8");
            //9.根据密码器的初始化方式--加密:将数据加密
            byte [] byte_AES=cipher.doFinal(byte_encode);
            //10.将加密后的数据转换为字符串
            //这里用Base64Encoder中会找不到包
            //解决办法:
            //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
            String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
            //11.将字符串返回
            return AES_encode;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //如果有错就返加nulll
        return null;
    }
    /*
     * 解密
     * 解密过程:
     * 1.同加密1-4步
     * 2.将加密后的字符串反纺成byte[]数组
     * 3.将加密内容解密
     */
    public static String AESDncode(String content){
        try {
            // 初始化算法,设置成“SHA1PRNG”是为了防止在linux环境下随机生成算法
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed("xxx".getBytes("utf-8"));

            //1.构造密钥生成器,指定为AES算法,不区分大小写
            KeyGenerator keygen=KeyGenerator.getInstance("AES");
            //2.根据ecnodeRules规则初始化密钥生成器
            //生成一个128位的随机源,根据传入的字节数组
            keygen.init(128,secureRandom);
            //3.产生原始对称密钥
            SecretKey original_key=keygen.generateKey();
            //4.获得原始对称密钥的字节数组
            byte [] raw=original_key.getEncoded();
            //5.根据字节数组生成AES密钥
            SecretKey key=new SecretKeySpec(raw, "AES");
            //6.根据指定算法AES自成密码器
            Cipher cipher=Cipher.getInstance("AES");
            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
            cipher.init(Cipher.DECRYPT_MODE, key);
            //8.将加密并编码后的内容解码成字节数组
            byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
            /*
             * 解密
             */
            byte [] byte_decode=cipher.doFinal(byte_content);
            String AES_decode=new String(byte_decode,"utf-8");
            return AES_decode;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }

        //如果有错就返加nulll
        return null;
    }

    public static void main(String[] args) throws Exception {

        if(args.length!=1){
            throw  new Exception("请输入需要加密的内容!");
        }
        String user=args[0];

        String encrpt = AESEncode(user);
        System.out.println("加密后的密文为:"+encrpt);

        System.out.println(AESDncode(encrpt));
    }

}

使用

ApplicationContext  context = new ClassPathXmlApplicationContext(xmlpath);

注意:必须使用 ClassPathXmlApplicationContext,不能使用

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(xmlpath));

XmlBeanFactory 这种方式不支持

ClassPathXmlApplicationContext为启动加载即实bean,XmlBeanFactory 为延迟实例化bean,如果原先是用的XmlBeanFactory ,而现在改为ClassPathXmlApplicationContext后因为启动加载bean报错,就在beans中加入 

或者在每个bean中加入

在beans中加入的default-lazy-init="true" 为全局设置,在bean中加入的lazy-init="true"为单个设置 ,单个设置优先局部

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 配置数据库用户名密码加密 的相关文章

  • 关于Git的一点思考

    GIT历史 很多人都知道 Linus在1991年创建了开源的Linux 从此 Linux系统不断发展 已经成为最大的服务器系统软件了 Linus虽然创建了Linux 但Linux的壮大是靠全世界热心的志愿者参与的 这么多人在世界各地为Lin
  • Spring 配置数据库用户名密码加密

    Spring 配置数据库用户名密码加密 传统形式配置数据库用户名密码 对于一般的spring框架 经常要用到数据源配置 如果是用xml配置的话 一般都是如下形式 数据库用户名密码密文配置实现 现在的需求是不能在配置文件里明文配置数据库用户名
  • Java使用Spire.Doc实现Word转换Pdf

    通过本文你将学到 Spire Doc是什么 如何在项目中引入Spire Doc依赖 项目中基于Spire Doc封装工具类实现实现Word转换Pdf 一 Spire Doc是什么 1 Spire Doc是成都冰蓝科技有限公司开发的一款简单易
  • 分布式环境下的数据一致性

    1 互联网技术的四大法宝 多线程 分布式 异步 缓存 2 事务 编程式事务 3乐观锁 悲观锁 基于状态机的乐观锁
  • java与C#的比较

    一 C 和java哪个更好 几天前 我的北理工研究生面试 老师问了我这样一个问题 你认为C 和java哪个更好 那么 作为读者的你 会怎么回答这道题呢 其实 在我看来 这道题无非是想问你c 和java有什么异同 同为开发语言 并不能说哪个更
  • java内存结构

    一 Java内存分配 1 Java有几种存储区域 寄存器 在CPU内部 开发人员不能通过代码来控制寄存器的分配 由编译器来管理 栈 在Windows下 栈是向低地址扩展的数据结构 是一块连续的内存的区域 即栈顶的地址和栈的最大容量是系统预先
  • Spring MVC Controller传递枚举值示例

    功能描述 本文将通过一个小示例 展示在请求参数中传递枚举值 枚举定义 角色类定义 public enum RoleEnum EMPLOYEE short 1 Employee MANAGER short 2 Manager private
  • BUG库,列举我从今天开发遇到的BUG

    java lang IllegalArgumentException Invalid character found in the request target 在请求目标中发现的无效字符 方法请求体传入非法参数 一般是前台的锅 java
  • feign接口自动生成工具

    Feign Generator 介绍 最近发现开发spring cloud时 编写feign接口是一件痛苦的事 不仅要编写feign接口 还有fallback 请求参数和返回值等 大量重复工作 很浪费时间 于是便想到可以编写工具自动生成fe
  • Java使用Spire.Pdf实现PDF添加图片水印

    通过本文你将学到 Spire Pdf是什么 如何在项目中引入Spire Pdf依赖 项目中基于Spire Pdf实现PDF添加图片水印 一 Spire Pdf是什么 1 Spire Pdf是成都冰蓝科技有限公司开发的一款简单易用 功能强大的
  • 常用jar包用途说明

    jar包 用途 axis jar SOAP引擎包 commons discovery 0 2 jar 用来发现 查找和实现可插入式接口 提供一些一般类实例化 单件的生命周期管理的常用方法 jaxrpc jar Axis运行所需要的组件包 s
  • 快速了解SDK和API的区别

    快速了解SDK和API的区别 SDK 是 Software Development Kit 的缩写 软件开发的工具包 辅助开发某一类软件的相关文档 范例和工具的集合都能叫做SDK SDK被开发出来是为了减少程序员工作量的 如果有公司开发出了
  • 集合泛型为对象,根据对象的某个属性进行排序

    根据集合里的深度 排序集合 Collections sort irFldsltpvMList new Comparator 为集合名 为实体类对象 Override public int compare IrFldsltpvM o1 IrF
  • BeanUtils使用方法

    BeanUtils类可以帮助我们copy值到类的属性中 也可以copy一个对象到另一个对象 java view plain copy UserEO user new UserEO String key userName String val
  • 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过 一个好的东西往往是是说不清楚的 姑且不论这句话的对与错 但我真的很佩服 淘宝技术这十年 这本书的作者子柳 能够通过淘宝的一些故事 按照时间顺序和IT发展的各种技术描述清楚 而且过程中读起来非常有意思 该读书笔记中参杂了很多原文的知
  • 非科班出身的我 如何靠自学编程 毕业拿大厂20k x 16 offer 自学java路线总结 经验分享

    文章目录 前言 了解自己 前置学习 java基础 java高阶 微服务SpringBoot 软硬数据库 项目实战 前言 对于很多和我一样的 非科班出身的小白来说 对于编程应该是一种向往但不可及的状态吧 我记得自己大一时就是这样的 心里知道编
  • java底层实现定时延时的途径

    Timer定时器 时间间隔示意 例子一 public class TestTimer private static Timer timer new Timer private static Logger logger LoggerFacto
  • SpringSecurity实现OAuth2.0 - 基础版授权服务

    OAuth2 0协议 OAuth3 0概述 OAuth2 0是一个关于授权的开放网络协议 该协议在第三方应用与服务提供平台之间设置了一个授权层 第三方应用需要服务资源时 并不是直接使用用户帐号密码登录服务提供平台 而是通过服务提供平台的授权
  • 泛型是实体类的集合,根据某一字段排序

    举例 List
  • 轻型数据库SQLite与Android实例

    SQLite 是一款轻型的数据库 是遵守ACID的关联式数据库管理系统 它的设计目标是嵌入式的 而且目前已经在很多嵌入式产品中使用了它 它占用资源非常的低 在嵌入式设备中 可能只需要几百K的内存就够了 它能够支持Windows Linux

随机推荐

  • Windows 在VMware16.x安装Win11系统详细教程

    文章目录 一 准备 二 创建虚拟机 1 创建新的虚拟机 2 选择虚拟机硬件兼容性 3 安装客户机操作系统 4 选择客户机操作系统 5 命名虚拟机 6 固件类型 7 处理器配置 8 此虚拟机内存 9 网络类型 10 选择I O控制器类型 11
  • 基于MVC架构访问数据库写一个登录系统

    题目 在C 中基于MVC架构写一个通过网页输入账号名密码 访问数据库 如果存在则创建该用户的系统 先完成基本功能 再往上加注册 返回数据库数据 文件处理等内容 这不是一个成熟项目 而是通过学习不断更新 并记录自己的思路 环境 Visual
  • 常见的APM(Application Performance Management应用性能管理)

    我也来对比下pinpoint和skyWalking 主流开源APM Zipkin Pinpoint SkyWalking全面对比 常见APM技术选型
  • Opencv求取连通区域重心

    我们有时候需要求取某一个物体重心 这里一般将图像二值化 得出该物体的轮廓 然后根据灰度重心法 计算出每一个物体的中心 步骤如下 1 合适的阈值二值化 2 求取轮廓 3 计算重心 otsu算法求取最佳阈值 otsu法 最大类间方差法 有时也称
  • 如何批量制作准考证——《超级处理器》应用

    超级处理器下载 怎么批量制作如下图所示的准考证 准考证中不仅包含有常规的姓名 年级 座号等常规信息 还含有学生照片和学号的条形码 条形码自动生成 并且照片和条形码都是自动对齐单元格 自动排版 我们来看下具体是怎么做的 首先我们要准备三样东西
  • SpringBoot拦截所有请求,记录日志表

    1 创建一个类并实现HandlerInterceptor 拦截器 import org springframework core env Environment import org springframework jdbc core Jd
  • 【转】物联网常见通信协议

    转载地址 https www jianshu com p f3f1a35f64cc 1 通信 与 通讯 傻傻分得清 传统意义上的 通讯 主要指电话 电报 电传 通讯的 讯 指消息 Message 媒体讯息通过通讯网络从一端传递到另外一端 媒
  • 第6课 微信小程序模板的引入与使用:

    第6课 微信小程序模板的引入与使用 在template1 wxml中自定义一个wxml模板
  • 使用Python,OpenCV给原视频每一帧画面添加素描漫画版小窗口,并生成新视频

    使用Python OpenCV给原视频每一帧画面添加素描漫画版小窗口 并生成新视频 主要涉及3部分 使用python 进行视频帧率 总帧数获取 使用moviepy 进行视频音频提取 并合并音频视频 遍历视频流每一帧 并对其进行简易漫画绘制
  • 使用代码操作Excel文件(easyExcel)

    文章目录 1 Maven导入easyExcel包 2 easyExcel进行基本的写入 3 编写代码 读和写 EasyExcel文档 https www yuque com easyexcel doc easyexcel 1 Maven导入
  • 脚手架(vue-cli)的安装详细教程

    首先要下载node js 下载 Node js 中文网 nodejs cn https nodejs cn download 大家根据自己的系统来选择哪个 我是Windows系统 所以选择红色箭头所指的安装包去安装 接下来双击安装 选择要安
  • 吹捧不是区块链的全部,冷静才是正道!

    尽管区块链能给我们带来完全不同的想象空间 但是依然掩盖不了它是一个新生的底层技术的现实 如果在一个技术的新生阶段就去吹捧它如何之好 显然是不对的 因为对于新生技术来讲 它的最初阶段最应该具备的 姿势 就是不断丰富和完善自己 为自己未来与诸多
  • 稳定和不稳定排序算法之间的区别?

    最近在一次采访中 在对排序算法提出了一些最初的问题 例如 您如何编写QuickSort或QuickSort和MergeSort之间的区别 之后 访问者问您是否了解稳定和不稳定的排序算法之间的区别 这个问题对我的读者来说是新问题 所以他说 对
  • 马云谈王坚博士!

    马云谈王坚博士 阿里的了不起在于把一个心理学博士变成出色的CTO 文 马云 阿里巴巴董事局主席 第一次见到王坚博士时 我震撼于他对互联网技术未来发展的理解 有一种相见恨晚的感觉 第一次在集团战略会议上听到博士谈未来数据时代 惊叹于他对数据技
  • 数学建模(五)1、皮尔逊相关系数

    皮尔逊相关系数 一 相关基本数学概念 总体和样本 二 皮尔逊相关系数 1 总体均值与总体协方差 2 总体皮尔逊相关系数 3 样本皮尔逊相关系数 4 相关性可视化 5 皮尔逊相关系数的一些理解误区 在统计学中 皮尔逊积矩相关系数用于度量两个变
  • 前缀和与差分(初学推荐)

    前缀和 适用于静态数组区间和 时间复杂度 O n 原理 当两个整数a b对k具体相同余数 a k b k 那么a b一定为k的倍数 a b 一维前缀和 题目一 k倍区间 给定一个长度为N的数列 A1 A2 AN 如果其中一段连续的子序列Ai
  • BI数据分析方法小结

    author skate time 2011 04 06 对于电子商务网站 我们该如何对数据分析呢 当我们拿到数据的时候该做些什么 要回答这几个问题前 先回答如下问题 1 数据是给谁看的 2 看数据的人 想从数据中得到什么 或者用数据证明什
  • java创建类关键字_在Java中,可以使用关键字【】来创建类的实例对象

    摘要 特别叫量呼的海是对 使用关集中用于部过的局负荷控制 向某行试呼的个目特定制用制在某一来限段内的进次数时间g控 学院现重如发患全隐大安 创例对或发故全事生学生安 息 造作被坚决因信杜绝动成工 迅速向分管院告要在第一长报时间 使用关撞击角
  • Spring 如何使用JDK动态代理呢?

    转自 Spring 如何使用JDK动态代理呢 下文是笔者采用示例的方式讲述JDK动态代理的实现方法 如下所示 实现思路 Spring JDK 动态代理需要实现 InvocationHandler 接口 重写 invoke 方法 客户端使用
  • Spring 配置数据库用户名密码加密

    Spring 配置数据库用户名密码加密 传统形式配置数据库用户名密码 对于一般的spring框架 经常要用到数据源配置 如果是用xml配置的话 一般都是如下形式 数据库用户名密码密文配置实现 现在的需求是不能在配置文件里明文配置数据库用户名