当前位置: 首页 > 科技观察

Java中如何对配置文件中的数据库账号和密码进行加密?

时间:2023-03-12 16:40:01 科技观察

作为一名程序员,日常的开发工作离不开与数据库的打交道,而我们的应用程序中也经常会配置数据库链接。你有没有想过,只要有权限访问我们项目代码的人,都可以看到配置文件中的账号密码?相信很多人项目中的配置文件都是这样写的################Mysql配置##########################spring.datasource.type=com.zaxxer.hikari.HikariDataSourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driversspring.datasource.url=jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8&useTimezone=true&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=123456spring.datasource.url配置了数据库链接地址和端口,spring.datasource.username配置了账号,spring.datasource.password配置了密码。如果这样写,无异于裸奔。任何有权访问此文件的人都可以使用MySQL客户端工具连接数据库,其中的数据根本不安全。当然,如果是本地或者测试环境还可以,但是对于生产环境就不能接受了。毕竟这样的安全性太差了,不小心把数据库删了跑了还是有可能的。相对来说,有经验的数据库运维人员不会直接提供数据库服务的IP地址和端口,而是提供域名,在url地址上配置对应的域名,然后通过解析让其访问数据库服务域名,域名地址是不对外解析的,所以生产环境的hosts和开发者本机需要配置hosts来配置域名对应的IP地址。这种方法会比上面的直接裸奔形式要好。外人拿到代码,没有hosts配置是无法访问数据库的,相对难度更大。但是这样做也有一个问题,就是开发者仍然可以通过MySQL客户端访问数据。万一哪天心情不好,删库跑路也不是不可以,不然就有机会私自泄露数据。那么很多小明问,有没有什么办法可以有效控制这种情况呢?让尽可能少的人接触数据库中的数据,但同时又不能影响开发的进度,对开发要友好。如果有问题,就会有答案。这时候就需要介绍一个神器,那就是jasypt。jasypt可以帮我们在配置文件中配置加密后的账号和密码,再结合秘钥,全面掌控数据库的安全。让我们试试看。首先,有一个SpringBoot服务需要连接数据库。下面来看看在没有引入jasypt的情况下如何使用。代码如下:################Mysql配置##########################spring.datasource.type=com.zaxxer.hikari.HikariDataSourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driversspring.datasource.url=jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8&useTimezone=true&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=123456#Customer终端等待连接池连接的最大毫秒数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=1200000spring.datasource.hikari.auto-commit=truespring.datasource.hikari.connection-test-query=SELECT1UserController.javapackagecom.controller;导入com.mapper.UserEntity;导入com.mapper.UserMapper;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.boot.autoconfigure.EnableAutoConfiguration;导入org.springframework.web.bind.annotation.RequestMapping;导入org.springframework.web.bind.annotation.RestController;导入java.util.Date;importjava.util.List;@RestController@EnableAutoConfiguration@RequestMapping("/user")publicclassUserController{@AutowiredprivateUserMapperuserMapper;@RequestMapping("add")publicintaddUser(Stringname,Stringdesc)throwsException{intid,num=0;UserEntityu=newUserEntity(0,name,desc,newDate());num=userMapper.insert(u);id=u.getId();返回ID;}@RequestMapping("getlist")publicListlistUser()throwsException{ListUserEntitys=userMapper.getAll();System.out.println(UserEntitys.toString());返回用户实体;}}UserMapper.javapackagecom.mapper;importorg.apache.ibatis.annotations.*;importjava.util.List;/***@authorziyou*/publicinterfaceUserMapper{/***查询操作示例**@return*/@Select("SELECT*FROMt_user;")@Results({@Result(property="id",column="Id"),@Result(property="Name",column="Name"),@Result(property="Desc",column="Desc"),@Result(property="CreateTime",column="CreateTime")})列表<用户实体>getAll();/***插入操作示例*实体绑定自增ID,keyProperty为实体字段,keyColumn为数据库字段**@paramuser*@return*/@Insert("INSERTINTOt_user(`Name`,`Desc`,CreateTime)VALUES(#{Name},#{Desc},#{CreateTime});")@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="Id")intinsert(UserEntityuser);}此外,我们还有一张桌子。表中的数据是这样的。接下来我们启动服务,调用接口查询表中的数据。如下图,使用明文账号密码时,整个过程没有问题。接下来介绍jasypt,主要分为以下三步1.引入pom依赖com.github.ulisesbocchiojasypt-spring-启动器1.182.编写加密工具publicclassJasyptUtil{publicstaticvoidmain(String[]args){Stringaccount="root";字符串密码=“123456”;BasicTextEncryptor加密器=newBasicTextEncryptor();//密钥//encryptor.setPassword(System.getProperty("jasypt.encryptor.password"));encryptor.setPassword("eug83f3gG");//加密密码StringnewAccount=encryptor.encrypt(account);StringnewPassword=encryptor.encrypt(密码);System.out.println("加密账号:"+newAccount);System.out.println("加密密码:"+newPassword);}}因为我们要得到加密后的密文,所以首先要根据原来的账号密码和我们指定的秘钥生成加密后的密文。这里我们假设本地和测试环境的秘钥是eug83f3gG。通过以上工具,我们可以生成如下密文3.替换账号密码,我们将application.properties中的账号密码替换为上面的密文,如下图,使用ENC()对密文进行包裹################Mysql配置########################spring.datasource.type=com。zaxxer.hikari.HikariDataSourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8&useTimezone=true&serverTimezone=GMT%2B8spring.datasource.username=ENC(/YnTvPH7WnnqMHu+wKeccA==)spring.datasource.password=ENC(Xv829RzVs7pd2sv72/wsbg==)这里有三点我们此时无法正常启动服务,因为就是这样启动不成功,账号和密码错误,我们需要传入秘钥,让jasypt反向解析出正确的账号和密码,让我们链接到数据库;工具类中的秘钥要和生产环境保持一致不一样!!!使用ENC()包裹密文;接下来,我们可以通过两种形式将秘钥传入程序中使用,一种是以系统环境变量的形式配置秘钥,但不推荐;第二种是通过启动参数传入秘钥;这里我们使用第二个。在SpringBoot项目的启动参数中,我们添加这样一个配置-Djasypt.encryptor.password=eug83f3gG,然后我们重启应用,就可以启动成功了。启动成功后,再次访问上面的界面,可以看到效果是一样的。在后续的生产环境中,只需要在启动参数中传入一个不同于本地和测试环境的秘钥即可,可以有效防止数据库的账号密码被泄露。连开发人员都不知道是什么东西,只要配置运维人员就知道,这个安全性要高很多。你呢,我的朋友,你学会了吗?在您自己的项目中使用它!