当前位置: 代码网 > it编程>编程语言>Java > Java中加密配置文件中的数据库账号和密码实践

Java中加密配置文件中的数据库账号和密码实践

2026年09月13日 Java 我要评论
一、前言随着信息安全的日益受到重视,加密敏感数据在应用程序中变得越来越重要。jasypt(java simplified encryption)作为一个简化java应用程序中数据加密的工具,为开发者提

一、前言

随着信息安全的日益受到重视,加密敏感数据在应用程序中变得越来越重要。

jasypt(java simplified encryption)作为一个简化java应用程序中数据加密的工具,为开发者提供了一种便捷而灵活的加密解决方案。

本文将深入解析jasypt的工作原理,以及如何在spring boot项目中集成和使用jasypt来保护敏感信息

作为程序员每天的开发工作都离不开跟数据库打交道,而且我们的应用程序往往都会配置数据库的链接,那你有没有想过,任何一个能接触到我们项目代码的人员,都可以看到配置文件里面的账号秘密

二、jasypt简介

jasypt(java simplified encryption)是一个专注于简化java加密操作的工具。它提供了一种简单而强大的方式来处理数据的加密和解密,使开发者能够轻松地保护应用程序中的敏感信息,如数据库密码、api密钥等

jasypt的设计理念是简化加密操作,使其对开发者更加友好。它采用密码学强度的加密算法,支持多种加密算法,从而平衡了性能和安全性。其中,jasypt的核心思想之一是基于密码的加密(password based encryption,pbe),通过用户提供的密码生成加密密钥,然后使用该密钥对数据进行加密和解密

该工具还引入了盐(salt)的概念,通过添加随机生成的盐值,提高了加密的安全性,防止相同的原始数据在不同的加密过程中产生相同的结果,有效抵御彩虹表攻击

jasypt与spring boot天然契合,可以轻松集成到spring boot项目中,为开发者提供了更便捷的数据安全解决方案。通过jasypt,开发者可以在不深入了解底层加密算法的情况下,轻松实现数据的安全保护,使得应用程序更加可靠和安全

三、项目配置

相信很多人的项目里面配置文件都是类似这样写的

############### mysql配置 #########################
spring.datasource.type=com.zaxxer.hikari.hikaridatasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/abc?useunicode=true&characterencoding=utf-8&usetimezone=true&servertimezone=gmt%2b8
spring.datasource.username=root
spring.datasource.password=root

spring.datasource.url 中配置了数据库的链接地址和端口,spring.datasource.username 配置了账号以及spring.datasource.password 中配置了密码

如果是这样的写法,无非就是在裸奔,任何一个能接触到这个文件的人,都能够用 mysql 的客户端工具进行数据库的链接,里面的数据毫无安全可言。当然如果是本地或者测试环境都还可以,但是对于生产环境那是不能接受的,毕竟这样的安全性太差了,一不小心被删库跑路还是有可能的

相对而言,有一些经验的数据库运维人员是不会直接提供数据库服务的 ip 地址和端口的,而是提供域名,通过在 url 地址上面配置相应的域名,然后通过解析域名让其访问数据库服务,域名地址是不对外解析的,所以生产环境的主机以及开发人员的本机,需要进行 hosts 的配置,将域名对应 ip 地址配置起来

这种方式会比上面直接裸奔的形式好一点,外人拿到代码,没有 hosts 配置也是不能访问数据库的,难度相对来说高了一点。但是这样也有个问题,那就是开发人员还是可以通过 mysql 的客户端进行数据的访问,如果哪天心情不好,删库跑路也不是没有可能,或者说私自泄露数据也是有机会的

那么很多小明就问了,有没有一种方式,可以有效的控制这种情况呢?让尽量少了人接触到数据库的数据,但是同时也不能影响开发的进度,对于开发要友好

有问题,就会有答案,这个时候我们就需要介绍一款神器了,那就是 jasyptjasypt 可以帮助我们在配置文件中配置加密后的账号和密码,然后结合秘钥,就可以完全控制数据库的安全性。下面我们就来试一下吧

首先有一个需要连接数据库的 spring boot 服务,我们先看一下,在没有引入 jasypt 的时候,是如何使用的,代码如下:

四、项目信息

############### mysql配置 #########################
spring.datasource.type=com.zaxxer.hikari.hikaridatasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/abc?useunicode=true&characterencoding=utf-8&usetimezone=true&servertimezone=gmt%2b8
spring.datasource.username=root
spring.datasource.password=root

# 客户端等待连接池连接的最大毫秒数
spring.datasource.hikari.connection-timeout=20000
# 最小空闲连接数
spring.datasource.hikari.minimum-idle=5
# 最大连接池大小
spring.datasource.hikari.maximum-pool-size=20
# 连接池中空闲的最长时间毫秒
spring.datasource.hikari.idle-timeout=30000
# 池中连接关闭后的最长生命周期毫秒
spring.datasource.hikari.max-lifetime=1200000
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.connection-test-query=select 1

usercontroller.java

package com.controller;

import com.mapper.userentity;
import com.mapper.usermapper;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.autoconfigure.enableautoconfiguration;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

import java.util.date;
import java.util.list;

@restcontroller
@enableautoconfiguration
@requestmapping("/user")
publicclass usercontroller {

  @autowired
  private usermapper usermapper;

  @requestmapping("add")
  public int adduser(string name, string desc) throws exception {
    int id, num = 0;
    userentity u = new userentity(0, name, desc, new date());
    num = usermapper.insert(u);
    id = u.getid();
    return id;
  }

  @requestmapping("getlist")
  public list<userentity> listuser() throws exception {
    list<userentity> userentitys = usermapper.getall();
    system.out.println(userentitys.tostring());
    return userentitys;
  }
}

usermapper.java

package com.mapper;

import org.apache.ibatis.annotations.*;

import java.util.list;

publicinterface usermapper {
  /**
   * 查询操作示例
   */
  @select("select * from t_user;")
  @results({
    @result(property = "id", column = "id"),
    @result(property = "name", column = "name"),
    @result(property = "desc", column = "desc"),
    @result(property = "createtime", column = "createtime")
  })
  list<userentity> getall();

  /**
   * 插入操作示例
   * 将自增id绑定到实体,keyproperty是实体字段,keycolumn是数据库字段
   */
  @insert("insert into t_user(`name`,`desc`,createtime) values(#{name}, #{desc}, #{createtime});")
  @options(usegeneratedkeys = true, keyproperty = "id", keycolumn = "id")
  int insert(userentity user);

}

另外我们有一张表,表里面的数据是这样的,接下来我们启动服务,调用接口查询表的数据,如下所示:

说明在使用明文账号密码的时候,整个流程是没有问题,接下来,我们引入 jasypt ,主要分下面三个步骤

五、springboot集成jasypt

1、引入pom依赖

<!--springboot整合jasypt-->
<dependency>
	<groupid>com.github.ulisesbocchio</groupid>
	<artifactid>jasypt-spring-boot-starter</artifactid>
	<version>1.18</version>
</dependency>

2、编写加密工具类

publicclass jasyptutil {

  public static void main(string[] args) {
    string account = "root";
    string password = "root";
    basictextencryptor encryptor = new basictextencryptor();
    // 秘钥
    // encryptor.setpassword(system.getproperty("jasypt.encryptor.password"));
    encryptor.setpassword("eug83f3gg");
    // 密码进行加密
    string newaccount = encryptor.encrypt(account);
    string newpassword = encryptor.encrypt(password);
    system.out.println("加密后账号:" + newaccount);
    system.out.println("加密后密码:" + newpassword);
  }
}

因为我们要得到加密后的密文,所以我们先需要根据原始账号密码,以及我们指定的秘钥来生成加密后的密文,这里我们假设本地和测试环境的秘钥为eug83f3gg,通过上面的工具类,我们可以生成如下的密文

3、替换账号密码

我们将 application.properties 里面的账号密码用上面的密文替换,

如下所示,使用enc()包住密文

############### mysql配置 #########################
spring.datasource.type=com.zaxxer.hikari.hikaridatasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/abc?useunicode=true&characterencoding=utf-8&usetimezone=true&servertimezone=gmt%2b8
spring.datasource.username=enc(/yntvph7wnnqmhu+wkecca==)
spring.datasource.password=enc(xv829rzvs7pd2sv72/wsbg==)

这里说明三点

  • 此时我们还不能正常启动服务,因为就这样的话是启动不成功了,账号和密码是错误的,我们需要将秘钥传入,让jasypt 给我们反向解析出正确的账号和密码才能进行数据库的链接
  • 工具类中的秘钥保持跟生产环境不一样
  • 使用 enc() 包住密文

接下来我们可以将秘钥通过两种形式传进程序中使用,一种是将秘钥通过系统环境变量的形式进行配置,不过不建议;

第二种是通过启动参数将秘钥进行传入;

这里我们使用第二种,在 springboot 项目的启动参数中,我们增加这样的配置 -djasypt.encryptor.password=eug83f3gg,然后我们再重启应用,就可以启动成功了

启动成功了再次访问上面的接口,可以看到效果是一样的

后续在生产环境中,只需要在启动参数中传入与本地和测试环境不一样的秘钥,就可以有效的防止数据库的账号密码被泄露了,就连开发人员都不知道是什么,只要配置的运维人员知道,这个安全性就高很多了,怎么样小伙伴你学会了吗?赶紧在自己的项目中用起来吧

六、spring boot 3 集成 jasypt

1、添加依赖

在pom文件中添加一下依赖

<dependency>
  <groupid>com.github.ulisesbocchio</groupid>
  <artifactid>jasypt-spring-boot</artifactid>
  <version>3.0.5</version>
</dependency>

2、添加配置文件

未指定前后缀的话默认格式enc()括号里面是加密后的密文 然后实现自动解密

spring:
  # 数据源配置
  datasource:
    type: com.alibaba.druid.pool.druiddatasource
    driver-class-name: com.mysql.cj.jdbc.driver
    url: jdbc:mysql://localhost:3306/xxxxxx?characterencoding=utf8&servertimezone=asia/shanghai
    username: root
    password: enc(blc3uqbxshlca9tnmyjl7w==)
# 加密配置
jasypt:
  encryptor:
    # 指定加密密钥,生产环境请放到启动参数里面
    password: 0f7b0a5d-46bc-40fd-b8ed-3181d21d644f
    # 指定解密算法,需要和加密时使用的算法一致
    algorithm: pbewithmd5anddes
    iv-generator-classname: org.jasypt.iv.noivgenerator
#    property:
#      # 算法识别的前后缀,默认enc(),包含在前后缀的加密信息,会使用指定算法解密
#      prefix: enc@[
#      suffix: ]

3、启动类添加注解

在启动类上添加注解@enableencryptableproperties注解来开启自动解密

@springbootapplication
@mapperscan("cn.ruru.xxxxxx.**.mapper")
@enableencryptableproperties  // 开启自动解密功能
public class ruruapplication {
 public static void main(string[] args) {
  springapplication.run(ruruapplication.class, args);
 }
}

4、测试类

public class jasyptutil {

    public static void main(string[] args) {
        standardpbestringencryptor standardpbestringencryptor = new standardpbestringencryptor();
        /* 配置文件中配置如下的算法 */
        standardpbestringencryptor.setalgorithm("pbewithmd5anddes");
        /* 配置文件中配置的password */
        standardpbestringencryptor.setpassword("0f7b0a5d-46bc-40fd-b8ed-3181d21d644f");
        // 加密
        string jasyptpassworden = standardpbestringencryptor.encrypt("xxxxxx2024");
        // 解密
        string jasyptpasswordde =standardpbestringencryptor.decrypt(jasyptpassworden);
        system.out.println("加密后密码:" + jasyptpassworden);
        system.out.println("解密后密码:" + jasyptpasswordde);
    }
}

5、生产环境安全处理

jasypt的password值放在配置文件中在生产环境中是不安全的,我们可以将password值放到启动命令中,删除配置文件中password 的配置行,

启动命令如下所示:

java -djasypt.encryptor.password=password -jar jasypt-spring-boot-demo-0.0.1-snapshot.jar

或者

java -jar jasypt-spring-boot-demo-0.0.1-snapshot.jar --jasypt.encryptor.password=password

总结

jasypt作为一个简单而强大的加密工具,为java应用程序提供了便捷的数据保护方案。

通过与spring boot的集成,开发者可以在应用程序中轻松地加密和解密敏感信息。

在实际项目中,选择合适的加密方式、安全存储密码以及与spring security等安全框架的集成,都是保障应用程序安全的关键步骤。

希望本文能够帮助读者更深入地了解jasypt,并在实际项目中合理地运用加密技术

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com