SSM项目中数据库连接properties文件加密

这篇具有很好参考价值的文章主要介绍了SSM项目中数据库连接properties文件加密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring配置文件中数据库配置文件properties文件的加密

思路:在项目开始运行之前,先使用加密程序把正确的明文密码进行加密得到密文信息,修改配置文件中的password为密文,在项目启动的时候要把这个密文进行解开为明文、让spring连接数据库使用。
参考文章来源

一、加密原因

数据库连接进行加密的主要目的是为了保证应用软件的数据的正确性,防止恶意修改。

在Spring配置文件中,将数据库配置信息存储在properties文件中可以方便地管理和维护应用程序的配置。然而,如果这些敏感信息(例如数据库用户名和密码)未加密,在不法分子的攻击下,被获取和滥用进行恶意攻击和数据泄漏的风险将会显著增加。

#这里db.properties文件中外露了数据库连接信息,这会导致数据库存在很大的安全隐患
db.username=root
db.password=123456
db.url=jdbc:mysql:///schoolproject?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
db.driverClass=com.mysql.cj.jdbc.Driver

二、对SSM项目中数据库连接加密流程

  1. 首先,使用一个加密工具类实现对数据库连接的url、username、password、driverClass等明文信息通过工具类加密成密文。
package com.yjr.utils;

public class KaisaUtil {

    /***
     * 使用凯撒加密方式加密数据
     * @param orignal 原文
     * @param key 密钥
     * @return 加密后的字符
     */
    public static String encryptKaisa(String orignal, int key) {
        //将字符串转换为数组
        char[] chars = orignal.toCharArray();
        StringBuffer buffer = new StringBuffer();
        //遍历数组
        for(char aChar : chars) {
            //获取字符的ASCII编码
            int asciiCode = aChar;
            //偏移数据
            asciiCode += key;
            //将偏移后的数据转为字符
            char result = (char)asciiCode;
            //拼接数据
            buffer.append(result);
        }
        return buffer.toString();
    }

    /**
     * 使用凯撒加密方式解密数据
     *
     * @param encryptedData :密文
     * @param key           :密钥
     * @return : 源数据
     */
    public static String decryptKaiser(String encryptedData, int key) {
        // 将字符串转为字符数组
        char[] chars = encryptedData.toCharArray();
        StringBuilder sb = new StringBuilder();
        // 遍历数组
        for (char aChar : chars) {
            // 获取字符的ASCII编码
            int asciiCode = aChar;
            // 偏移数据
            asciiCode -= key;
            // 将偏移后的数据转为字符
            char result = (char) asciiCode;
            // 拼接数据
            sb.append(result);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String str = "com.mysql.cj.jdbc.Driver";
        String encode = encryptKaisa(str,255);
        System.out.println("加密后:"+encode);
        System.out.println(encode);
        String decode = decryptKaiser(encode, 255);
        System.out.println("解密后:"+decode);
    }
  1. 其次:将获取到密文数据后将db.properties中的明文改成密文
#数据库连接密文--此时数据库中的数据较为安全
db.username=űŮŮų
db.password=UVWXYZ
db.url=ũţšŢĹŬŸŲŰūĹĮĮĮŲŢŧŮŮūůűŮũŤŢųľŴŲŤŔŭŨŢŮţŤļųűŴŤĥŢŧŠűŠŢųŤűńŭŢŮţŨŭŦļŔœŅĬķĥŲŤűŵŤűœŨŬŤŹŮŭŤļŀŲŨŠĮŒŧŠŭŦŧŠŨ
db.driverClass=ŢŮŬĭŬŸŲŰūĭŢũĭũţšŢĭŃűŨŵŤű
  1. 自定义PropertiesPersist 解密类

该类继承spring的读取配置文件的类使spring启动时会加载这个类进行解密(需要在配置文件里面配置这个类的名称才会进行加载)
本项目是在applicationContext.xml里面配置了文章来源地址https://www.toymoban.com/news/detail-484104.html

package com.yjr.config;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

import com.yjr.utils.KaisaUtil;
import org.springframework.util.DefaultPropertiesPersister;

//该类继承spring的读取配置文件的类使spring启动时会加载这个类进行解密(需要在配置文件里面配置这个类的名称才会进行加载)
//本项目是在applicationContext.xml里面配置了
//项目启动时候可以在这个类中打断点进入看解密过程
public class PropertiesPersist extends DefaultPropertiesPersister{
    @Override
    public void load(Properties props, InputStream is) throws IOException {

            //读取到配置文件(****..properties)信息内容
            Properties properties=new Properties();
            properties.load(is);
            //判断读取配置文件中的信息是否为password属性
            if(properties.get("db.password")!=null){
                System.out.println("==========密文======="+properties.get("db.password"));
                System.out.println("==========密文======="+properties.get("db.username"));
                System.out.println("==========密文======="+properties.get("db.url"));
                System.out.println("==========密文======="+properties.get("db.driverClass"));

                System.out.println("===================进行配置数据库密码解密、注入配置文件===");
                //进行解密
                String username= KaisaUtil.decryptKaiser(properties.get("db.username").toString().trim(),255);
                String driverClass= KaisaUtil.decryptKaiser(properties.get("db.driverClass").toString().trim(),255);
                String url= KaisaUtil.decryptKaiser(properties.get("db.url").toString().trim(),255);
                String password= KaisaUtil.decryptKaiser(properties.get("db.password").toString().trim(),36);
                System.out.println("解密后的password="+password);
                System.out.println("解密后的username="+username);
                System.out.println("解密后的url="+url);
                System.out.println("解密后的driverClass="+driverClass);
                //在写入到配置文件中
                properties.setProperty("db.password", password);
                properties.setProperty("db.username", username);
                properties.setProperty("db.driverClass", driverClass);
                properties.setProperty("db.url", url);
            }
            OutputStream outputStream=null;
            try {
                outputStream=new ByteArrayOutputStream();
                properties.store(outputStream, "");
                is=outStream2InputStream(outputStream);
                super.load(props, is);
                System.out.println("=========配置数据库密码解密、注入配置文件=========【Success】==");
                System.out.println("=======注入的明文密码======:" +properties.get("db.password"));
                System.out.println("=======注入的明文账号======:" +properties.get("db.username"));
                System.out.println("=======注入的明文url======:" +properties.get("db.url"));
                System.out.println("=======注入的明文driverClass=====:" +properties.get("db.driverClass"));
            } catch (Exception e) {
                try {
                    throw e;
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }finally{
                outputStream.close();
            }
    }
    private InputStream outStream2InputStream(OutputStream out) {
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
        bos=(ByteArrayOutputStream) out;
        ByteArrayInputStream swapSTream=new ByteArrayInputStream(bos.toByteArray());
        return swapSTream;
    }
}


  1. 最后:在applicationContext.xml修改配置文件

<!--  首先:将原本的<context:property-placeholder location="classpath:db.properties"/> 修改为新的bean -->
     <!--    它定义了一个名为 configReader 的 Bean 对象,用于读取数据库配置文件 db.properties-->
    <bean id="configReader" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <!--        class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer":指定了这个 Bean 对象实现的类。-->
        <property name="locations">
            <list>
                <value>classpath*:db.properties</value>
            </list>
        </property>
    <!--        propertiesPersister 属性:表示将要使用一个自定义的 PropertiesPersist 类对象实现对配置文件中属性的解密操作。-->
        <property name="propertiesPersister">
    <!--            自定义解密类的全称-->
            <bean class="com.yjr.config.PropertiesPersist"/>
        </property>
    <!--       ignoreResourceNotFound 属性:设为 true; 表示即使没有找到这个配置文件也不会抛出异常。-->
        <property name="ignoreResourceNotFound" value="true"/>
    </bean>

到了这里,关于SSM项目中数据库连接properties文件加密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【飞机票售票系统】山东大学大二暑期数据库课程设计项目SSM+VUE2前后端分离(含源码)

    一、系统概述 二、需求分析 2.1 系统功能分析 2.2 系统数据分析 2.3 系统非功能分析 三、系统设计 3.1 应用程序设计 3.2 数据库设计 3.2.1 概念设计 3.2.2 逻辑设计 四、系统实现 4.1 关键技术实现 4.2 功能实现 五、系统测试 六、问题记录 飞机票售票系统,分为两个角色,系统管理

    2024年02月09日
    浏览(39)
  • SSM宾馆客房管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

    一、源码特点   SSM 宾馆客房管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代 码和数据库,系统主要采用B/S模式开发。 ssm 宾馆客房管理系统 前段主要技术 boots

    2024年02月08日
    浏览(50)
  • SSM培训报名管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

    一、源码特点   SSM 培训报名管理系统是一套完善的信息系统,结合SSM框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主 要采用B/S模式开发。 SSM培训报名管理系统1 前段主要技术html div js  后端主要技

    2024年02月08日
    浏览(39)
  • C#控制台连接Mysql数据库,有配置数据库连接字符串的配置文件

    实现功能 读取. .txt 中的配置文件,来初始化连接字符串 让连接字符串的配置文件不存在会主动创建默认的连接字符串 注意点: 需要引用Newtonsoft 使用mysql

    2024年02月10日
    浏览(59)
  • Java项目:ssm框架基于spring+springmvc+mybatis框架的民宿预订管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文)

    本项目是一套ssm827基于SSM框架的民宿预订管理系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse 确保可以运行! 该系统功能

    2024年01月22日
    浏览(84)
  • SSM度假村管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

    一、源码特点   SSM 度假村管理系统是一套完善的信息系统,结合SSM框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要 采用B/S模式开发。 SSM度假村管理系统1 前段主要技术html div js  后端主要技术

    2024年02月08日
    浏览(57)
  • .NET6项目连接数据库方式方法

    接上一篇Linux系统下创建dotnet项目,这一篇我们聊聊.NET6环境下dotnet项目连接数据库的方式方法,包括数据库字符串该如何配置。看了很多博主写的文章,连接数据库字符串配置的方式和位置五花八门,这篇文章给大家介绍一下连接数据库字符串的配置方式方法,顺便介绍下一

    2024年02月04日
    浏览(54)
  • 关于JAVA Maven项目连接mysql数据库

      本文作为个人学习笔记 此处使用8.0.28版本,关于mysql更多依赖版本查阅:https://mvnrepository.com/artifact/com.mysql/mysql-connector-j 1、指定驱动器 本部分指定jdbc驱动器类名,使用Class.forName()以加载数据库驱动程序 2、指定数据库 本部分指定所需数据库的url链接,(注:在测试过程中

    2024年04月12日
    浏览(77)
  • 【项目】基于C++11实现的数据库连接池

    MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和 unique_lock 、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型 MySQL是一个基于C/S设计的关系型数据库管理系统,一条SQL的执行需要通过mysql client发起一个连接,

    2024年02月07日
    浏览(37)
  • java SSM项目预算生成管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

    一、源码特点     java SSM项目预算生成管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,spring+springMVC+mybatis),对理解JSP java编程开发语言有帮助,系统具有完整的 源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为M

    2024年01月22日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包