13、SpringBoot-配置文件里密码加密
系列导航
6、SpringBoot-mybatis分页实现pagehelper
9、SpringBoot-mybatis-druid多源数据多源数据
10、SpringBoot-mybatis-plus-druid多源数据
11、SpringBoot-mybatis-plus-druid多源数据事务
12、SpringBoot-mybatis-plus-ehcache
14、SpringBoot-easyexcel导出excle
完结
springboot连接数据库,数据库的用户名、密码默认多是明文放在配置文件里,如何提高安全性不要明文写在配置文件里,不问就解决这个问题。
1、数据库中创建表
CREATE TABLE TEST_BLOCK_T
(
BLOCK_ID VARCHAR2(10 BYTE) PRIMARY KEY, --编码
BLOCK_NAME VARCHAR2(200 BYTE) --资源名称
);
Insert into TEST_BLOCK_T (BLOCK_ID, BLOCK_NAME) Values ('1', '哈哈哈');
COMMIT;
2、pom.xml依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> <!--密码加密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
3、工程结构

4、源码
package com.example.demo.controller; import org.jasypt.encryption.StringEncryptor;
import org.jasypt.util.text.BasicTextEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/hello")
public class HelloController { @Autowired
JdbcTemplate jdbcTemplate; @Autowired
StringEncryptor stringEncryptor; //访问数据库的数据
@GetMapping("/list")
@ResponseBody
public String index() { String sql = "SELECT BLOCK_NAME FROM TEST_BLOCK_T WHERE BLOCK_ID = ?"; // 通过jdbcTemplate查询数据库
String mobile = (String) jdbcTemplate.queryForObject(sql, new Object[]{1}, String.class); return "Hello " + mobile;
} //对配置文件中的用户名密码加密,加密盐也是用配置文件里的
@GetMapping("/passwd")
@ResponseBody
public String passwd() { //加密密码
String name = stringEncryptor.encrypt("zy");
String pwd = stringEncryptor.encrypt("1");
System.out.println("name:"+name);
System.out.println("pwd:"+pwd);
return "success!"; } //解密配置文件中的用户名和密码,加密盐也是用配置文件里的
@GetMapping("/unpasswd")
@ResponseBody
public String unpasswd() {
//解密密码
String name = stringEncryptor.decrypt("YCfAQQPOSw5Jp/uzmA8LkQ==");
String pwd = stringEncryptor.decrypt("hOwW0zxYpHaEH/lkpHyJaA==");
System.out.println("name:"+name);
System.out.println("pwd:"+pwd);
return "success!"; } //对配置文件中的用户名密码加密,加密盐使用代码里的
@GetMapping("/passwd1")
@ResponseBody
public String passwd1() { BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的salt(盐),自定义
textEncryptor.setPassword("hello");
//要加密的数据(数据库的用户名或密码)
String username = textEncryptor.encrypt("zy");
String password = textEncryptor.encrypt("1");
System.out.println("username:"+username);
System.out.println("password:"+password); return "success!"; } }
package com.example.demo; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} }
5、配置文件
# 应用名称
spring.application.name=demo
# 应用服务 WEB 访问端口
server.port=8080 # 数据库设置
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@192.168.0.100:1521:orcl
#spring.datasource.username=zy
#spring.datasource.password=1
jasypt.encryptor.password=hello
spring.datasource.username=ENC(YCfAQQPOSw5Jp/uzmA8LkQ==)
spring.datasource.password=ENC(hOwW0zxYpHaEH/lkpHyJaA==)
6、测试
(1)用户名密码明文连接数据库
配置文件

访问查询数据库的接口 http://localhost:8080/hello/list
返回值:Hello 哈哈哈
(2)用户名密码明文连接数据库
<1>配置文件中打开jasypt.encryptor.password的参数,让系统知道加密盐的值。
完整配置如下:

<2>调用接口 http://localhost:8080/hello/passwd 获取加密后的用户名和密码
输出的结果是:
name:YCfAQQPOSw5Jp/uzmA8LkQ==
pwd:hOwW0zxYpHaEH/lkpHyJaA==
修改配置文件如下,其中EMC()就是告诉系统里面的内容是加密过的需要解密

<3>重启项目 调用接口 http://localhost:8080/hello/list
正常返回数据结果:Hello 哈哈哈
到此给配置文件中的敏感信息加密就完成了。这样做有个缺点就是加密盐是在配置文件里的,对方如果非要解密是可以做到的,例如:
<4>密文解密
将加密后的密文放到如下代码中

调用接口http://localhost:8080/hello/unpasswd
结果:
name:zy
pwd:1
到此成功解密出了之前加密的密文。所以之前的加密只能拦住不懂这个加密的人,真正懂得人是拦不住的依然可以解密出来。那还有没有更安全一些的做法?有
<5>启动时指定加密盐
先将程序打成jar包 如何打包参考https://www.cnblogs.com/yclh/p/15947054.html
打包后将配置文件中的如下这段去掉,配置文件中就没有加密盐的信息了
jasypt.encryptor.password=hello
启动的jar包的时候使用如下语句,其中“hello”就是加密盐,SpringBoot_PassWord.jar就是打好的jar包
java -jar -Djasypt.encryptor.password=hello SpringBoot_PassWord.jar

启动成功后访问接口:http://localhost:8080/hello/list
成功返回参数:Hello 哈哈哈
还有没有其他更安全的方式,网上看到也有单独搞个配置文件,设置环境变量等操作起来有点麻烦,个人感觉就没有绝对安全的,只要想破解的人懂你设置的那个套路就能破解,不管你把这个加密盐藏在哪里总归是有个地方存的。所以最好的加密就是你搞得东西别人不懂,懂得人欺负不懂得人。
13、SpringBoot-配置文件里密码加密的更多相关文章
- springboot对数据库密码加密
第一步:maven引jar包 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifa ...
- SpringBoot项目配置文件中密码的加密
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/15565862.html 版权声明:本文为博主原创文章,转载请附上博文链接! 公众号:追梦1819 ...
- Spring Boot 配置文件密码加密两种方案
Spring Boot 配置文件密码加密两种方案 jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring 项目中.可以快速集成到 Spring Boot 项 ...
- 配置 Druid 数据源及密码加密-SpringBoot 2.7 实战基础
在SpringBoot中配置 Druid 数据源及密码加密的方法 前文集成 MyBatis Plus,实现了一组增删改查接口.在启动服务时,从控制台中可以看出 Spring Boot 默认使用 Hik ...
- 解决spring-boot配置文件使用加密方式保存敏感数据启动报错No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly
spring-boot配置文件使用加密方式保存敏感数据 application.yml spring: datasource: username: dbuser password: '{cipher} ...
- Jasypt加密SpringBoot配置文件
如果 SpringBoot 的 properties 文件中含有用户名密码等敏感信息,为了安全起见需要对明文密码加密.Jasypt 是用来加密的 jar 包. 1.引入 Jasypt 在 pom.xm ...
- 【SpringBoot】SpringBoot集成jasypt数据库密码加密
一.为什么要使用jasypt库? 目前springboot单体应用项目中,甚至没有使用外部配置中心的多服务的微服务架构的项目,开发/测试/生产环境中的密码往往是明文配置在yml或properties文 ...
- Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)
大家好!我是小富- 这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号.密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小. 说起这 ...
- tomcat安全配置之证书密码加密存储
最近项目组要完成一个新Web Servicer接口的开发,其中有项要求是支持外部客户程序以https方式访问这些SOAP接口.项目组当前基于tomcat6.0.29开发,axis版本为1.4.拿到这个 ...
- mysql-8.0 安装教程(自定义配置文件,密码方式已修改)
下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录.后 ...
随机推荐
- ACPM高效C++组件管理让音视频终端SDK性能更好、稳定性更高
本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构.技术性能.开发能效和最佳实践,一起开启音视频的开发之旅.本文为MediaBox技术架构篇,重点从 ACPM介绍. ...
- java协程操作mysql数据库
我的项目: nanshaws/nettyWeb: 复习一下netty,并打算做一个web项目出来 (github.com) 最近在项目中分别添加了虚拟线程操作mysql数据库,和用协程操作mysql数 ...
- 【eBPF-01】初见:基于 BCC 框架的第一个 eBPF 程序
闲言少叙,本文记录了如何零基础通过 BCC 框架,入门 eBPF 程序的开发,并实现几个简易的程序. 有关 eBPF 的介绍,网络上的资料有很多,本文暂且先不深入讨论,后面会再出一篇文章详细分析其原理 ...
- 【scikit-learn基础】--『监督学习』之 岭回归
岭回归(Ridge Regression)是一种用于处理共线性数据的线性回归改进方法.和上一篇用基于最小二乘法的线性回归相比,它通过放弃最小二乘的无偏性,以损失部分信息.降低精度为代价来获得更实际和可 ...
- 结合 element -Plus组件库,压缩图片大小,限制图片格式
业务背景:业务上需求满足上传的图片不能太大,但是有时候上传的图片确实超过了限制大小,所以前端这边可以将图片压缩再上传,亦或者是上传给后端接口的图片只能是指定格式,我们前端需要将图片后缀转化,也可以处理 ...
- 【笔记】Ribbon负载均衡伪随机算法
伪随机:思路 当一个下标(伪服务)连接被调用两次,第三次如果还是它,就让再随机一次 当重复随机到一台服务两次时判断第三次是否还是它 是的话 我们要进行 再次随机 也就是第三次 package top. ...
- 部署堡垒机4——CentOS7 编译安装 Python 3.8.12
1.去python3的官方网站下载源代码 https://www.python.org/downloads/ 下载安装Python 3.8.12到/opt/python3 cd /opt wget h ...
- 修改Ubuntu登录欢迎界面
查看登录效果 run-parts /etc/update-motd.d ubuntu 与别的linux不同,直接修改/etc/motd文件重登录后无效.因为这里/etc/motd是一个符号链接,指向/ ...
- 细说SQL与ETL之间的小秘密
本文分享自华为云社区<GaussDB数据库SQL系列-SQL与ETL浅谈>,作者:Gauss松鼠会小助手2. 一.前言 在SQL语言中,ETL(抽取.转换和加载)是一种用于将数据从源系统抽 ...
- 【API进阶之路】因为不会创建云服务器,我被实习生摆了一道
摘要:9个步骤通过API创建云服务器. 事情是这样的,公司成立了一个新项目,要给项目建官网,并搭建一个web服务器.按照我的习惯,搭建一个本地虚拟机就好了,部署简单方便还好配置,云服务器嘛,写了10年 ...