SpringBoot使用jasypt加解密密码

在我们的服务中不可避免的需要使用到一些秘钥(数据库、redis等);使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些。打开application.properties或application.yml,比如mysql登陆密码,redis登陆密码以及第三方的密钥等等一览无余,这里介绍一个加解密组件,提高一些属性配置的安全性。

开发和测试环境还好,但生产如果采用明文配置讲会有安全问题,jasypt是一个通用的加解密库,我们可以使用它。

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency>

配置文件:

# 加密的密钥
# 测试环境可以采用在配置文件中配置
# 生产环境建议采用启动参数的形式传入
# 其他配置参数参考:com.ulisesbocchio.jasyptspringboot.properties.JasyptEncryptorConfigurationProperties
jasypt.encryptor.password=you salt# 解密得到原始密码
spring.datasource.password= ENC(密文)

那密文怎么来的呢?

@Autowired
StringEncryptor stringEncryptor;@Test
public void encrypt() {System.out.println("PWD: " + stringEncryptor.encrypt("yourpassword"));
}
public static void main(String[] args) {BasicTextEncryptor textEncryptor = new BasicTextEncryptor();//加密所需的salt(盐)textEncryptor.setPassword("G0CvDz7oJn6");//要加密的数据(数据库的用户名或密码)String username = textEncryptor.encrypt("root");String password = textEncryptor.encrypt("root123");System.out.println("username:"+username);System.out.println("password:"+password);}

jasypt默认使用StringEncryptor来进行加解密,我们也可以自定义自己的加解密类来替换它。

再来详细介绍一下:

jasypt由一个国外大神写的一个springboot下的工具包。Git地址:https://github.com/ulisesbocchio/jasypt-spring-boot

直接上代码:

1、pom文件中增加依赖:

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency>

2、application.yml文件中增加jasypt的秘钥(该秘钥自定义的):

jasypt:encryptor:#加密秘钥password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7

3、测试类:

@RestController
public class IndexController {@Autowiredprivate StringEncryptor encryptor;/*** 测试jasypt加密解密*/@GetMapping("/jasypt")public void testJasypt() {String password = "123456";String encryptPwd = encryptor.encrypt(password);System.out.println("加密::" + encryptPwd);System.out.println("解密:" + encryptor.decrypt(encryptPwd));}}

4、启动服务,在控制台可以看到jaspyt的默认配置(比如加密方式是PBEWithMD5AndDES):
在这里插入图片描述

5、在浏览器请求(端口号自定义):http://localhost:18081/jasypt ,在控制台打印信息:

加密: stqvirrvG8TcLz9mqflBDQ==
解密:123456

jasypt由于其使用的是PBEWithMD5AndDES加密方式,所以每次加密出来的结果都不一样,但是解密都是一样的,所以很适合对数据进行加密

6、将加密的结果替换配置文件中的敏感字段(这里以数据库密码为例,数据库密码是123456):

spring:application:name: service-providerdatasource: driver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/mydb?autoReconnect=true&failOverReadOnly=false&createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=utf8username: rootpassword: ENC(stqvirrvG8TcLz9mqflBDQ==)

上面的 ENC()是固定写法,()里面是加密后的信息。

7、在测试类中增加代码:

    @Value("${spring.datasource.password}")private String dbPassword; // 数据库密码/*** 测试配置文件字段加密后,项目中该字段的值*/@GetMapping("/password")public String password() {return dbPassword;} 

请求http://localhost:18081/password,会发现结果是123456,说明直接将加密文件解密出来了

扩展

a、自定义上面第6点中ENC()的固定写法。在配置文件中增加jasypt.encryptor.property:

jasypt:encryptor:#加解密秘钥password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7#设置前缀后缀property:prefix: "ENC@["suffix: "]"

b、将加解密秘钥放在配置文件中是不安全的,有如下几种解决办法:

1、在启动类上赋值秘钥:

@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {/** 配置加解密秘钥,与配置文件的密文分开放 */System.setProperty("jasypt.encryptor.password", "travel-app");
//        System.setProperty("jasypt.encryptor.password", "EbfYkitulv73I2p0mXI50JMXoaxZTKJ7");SpringApplication.run(ProviderApplication.class, args);}}

2、自定义StringEncryptor:

	/*** 配置StringEncryptor*/@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7");config.setAlgorithm("PBEWithMD5AndDES");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.salt.NoOpIVGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}

踩过的坑

a、必须配置加解密用的秘钥,即jasypt.encryptor.password,不然启动会报错

b、springboot2.x以下的版本,只能用jasypt1.x的版本。如果用jasypt2.x的版本,启动会报错,详见https://github.com/ulisesbocchio/jasypt-spring-boot/issues/97

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 写字体投影,android-给字体设置投影

1&#xff0c;在代码中添加文字阴影TextView 有一个方法/*** Gives the text a shadow of the specified radius and color, the specified* distance from its normal position.** attr ref android.R.styleable#TextView_shadowColor* attr ref android.R.styleable#TextView…

android 开源图表动画,Android 图表开发开源库MPAndroidChart-Go语言中文社区

上面是APP中实现的效果图(点击可以放大查看)图1的效果不是用这个实现的&#xff0c;如果感兴趣可以参考我这篇文章 Android渐变圆环总体来说&#xff0c;MPAndroidChart可能是目前Android 开发最好用的一个三方库了&#xff0c;功能非常强大&#xff0c;集成简单。直接导入作为…

电脑开启防火墙后ping不通 及 开启防火墙后,不能远程的解决办法

有些情况下电脑需要开防火墙但是又希望能被远程或者ping通。 一、先查看电脑的网络类型&#xff08;第二步中打开对应网络类型下的协议&#xff09; 二、控制面板 - Windows防火墙 - 高级设置-入站规则 &#xff08;1&#xff09;开启防火墙后&#xff0c;能ping通设置。 &…

android 时间应用程序,Android在首次启动时需要更多时间启动应用程序

在我的项目中&#xff0c;我使用了需要multidex支持的库。 根据我的研究&#xff0c;我发现它会导致应用启动时出现延迟。我在gradle中启用了multidexfunction。 defaultConfig {multiDexEnabled true}我曾经为kitkat设备获得NoClassDefFound Exception&#xff0c;所以我添加了…

Mysql中用between...and...查询日期时注意事项

select count(1) from user where regist_date between 2017-07-25 00:00:00 and 2017-07-25 24:00:00;这条sql语句查询出结果为0。实际上数据库有一条符合该查询条件的数据。 错误原因&#xff1a;2017-07-25 24:00:00 晚上24点即为下一天00点 2017-07-26 00:00:00&#xff0…

android core log,Android 日志系统(Logcat)的实现分析

这篇说一下Android 日志系统的实现&#xff1a;1. Android中的打印分为4个缓冲区和6个打印等级&#xff0c;在frameworks\base\core\java\android\util\Log.java中有定义&#xff1a;四缓冲&#xff1a;public static final int LOG_ID_MAIN 0;public static final int LOG_ID…

android矢量图 内存大,Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。...

先上一个 位图和矢量图的 说明。外链网址已屏蔽维基百科里面有更详细的说明 我就不贴地址了。简单来说就是位图 比 矢量图要大。但是位图可以适用于各种场景。但是矢量图就只能显示一些有规律的图形。复杂的做不了或者是很难做。对于android来说&#xff0c;我们一般app里面 会…

idea 快捷键代码行标记并快捷跳到标记行

idea有一个组合快捷键 标记代码行&#xff08;左边的行数会出现一个1&#xff0c;代表着已经标记了&#xff09; ctrlshift1 迅速跳到标记行 ctrl1 这边给大家送上显示GIF

鸿蒙之火是什么意思,鸿蒙突然火了!鸿蒙是什么?

原标题&#xff1a;"鸿蒙"突然火了&#xff01;"鸿蒙"是什么&#xff1f;什么是鸿蒙&#xff1f;鸿蒙是什么&#xff1f;很多人都在发问&#xff0c;仿佛一夜之间就火了的鸿蒙有何独特之处&#xff1f;鸿蒙是真的来了。鸿蒙是文化&#xff0c;鸿蒙也是科技…

String类的indexOf方法的用法和举例

String类的indexof方法的作用和返回值&#xff1a; 今天在这里重点回顾一下&#xff0c;希望对大家能有所帮助&#xff1a; indexOf&#xff08;int&#xff0c;ch&#xff09; 先看第一个indexOf它返回值是int&#xff0c;在看它的参数&#xff08;int&#xff0c;ch&#x…

Java字符串池(String Pool)深度解析

在工作中&#xff0c;String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销&#xff0c;避免字符串的重复创建&#xff0c;其维护了一块特殊的内存空间&#xff0c;这就是我们今天要讨论的核心&#xff0c;即字符串池&#xff08;String Pool&#xff0…

用dl元素编辑html个人信息,html dl dt dd标签元素语法结构与使用

dl dt dd认识及dl dt dd使用方法一、dl dt dd认识 - TOPhtml 是一组合标签&#xff0c;使用了dt dd最外层就必须使用dl包裹&#xff0c;此组合标签我们也又叫表格标签&#xff0c;与table表格类似组合标签&#xff0c;故名我们也叫dl表格(扩展阅读&#xff1a;table tr td、…

千牛怎么注销卖家店铺_新店铺怎么拥有亚马逊购物车?亚马逊小卖家如何尽快获得黄金购物车?...

我做跨境电商也有六年的时间了&#xff0c;在电商这个行业也有自己的一些经验。经验也许没有其他大卖家丰富&#xff0c;但会将我知道的都进行分享。如果有不懂得亚马逊问题可以我(V&#xff1a;772024802)。我这里给大家安排一堂直播课&#xff0c;可以系统的帮你解决做亚马逊…

mysql中like是否使用索引

一.测试数据 CREATE TABLE test_orderdetail (id int(11) NOT NULL AUTO_INCREMENT,order_id int(11) DEFAULT NULL,product_name varchar(100) DEFAULT NULL,cnt int(11) DEFAULT NULL,create_date datetime DEFAULT NULL,PRIMARY KEY (id),KEY idx_orderid_productname (pro…

电子科大16秋计算机应用基础在线作业一,电子科大16秋《计算机应用基础(本科)》在线作业3...

电子科技大学电子科大16秋《计算机应用基础(本科)》在线作业3一、单选题(共35 道试题&#xff0c;共70 分。)1. 在Windows,打开一个菜单后,其中某菜单项会出现下属级联菜单的标识是()。A. 菜单右侧有一组英文提示B. 菜单右侧有一个黑色三角形C. 菜单左侧有一个黑色圆点D. 菜单左…

wince手机投屏代码_除了 iOS,这些手机系统你肯定没用过

今年是2020年&#xff0c;智能手机市场经过大浪淘沙&#xff0c;留存下来的品牌可以说都是精品&#xff0c;国外的像苹果、三星、索尼、LG&#xff0c;国内有华为、小米、OV、魅族....都是有特色有竞争力的。华为在海外的巨幅广告牌但是大家有没有发现&#xff0c;如此多的手机…

SpringBoot读取Resource下文件的几种方式

最近在项目中涉及到Excle的导入功能&#xff0c;通常是我们定义完模板供用户下载&#xff0c;用户按照模板填写完后上传&#xff1b;这里待下载模板位置为resource/excleTemplate/test.xlsx&#xff0c;尝试了四种读取方式&#xff0c;并且测试了四种读取方式分别的windows开发…

kido机器人用流量吗_国脉电信200元天网卡,交1700流量无线用,拉人加入还会有不错的收益,你信吗?反正我是不信!...

最近又很多人咨询小编国脉天电信网卡是真的吗&#xff0c;是不是骗人的。关于国脉天网骗局&#xff0c;反传销联合会曾在网站发表了一篇关于国脉天网骗局的文章。今天来说说200元的国脉天网和1700的流量包。首先来说说200元购买的国脉天网卡&#xff0c;这个也就是国脉电信推广…

孩子学计算机最佳年龄,孩子学编程最佳年龄是多少

随着IT技术几十年的发展&#xff0c;编程也正变得越来越简单、易用&#xff0c;而不再是那么复杂、繁琐。那么孩子学编程最佳年龄是多少呢&#xff1f;孩子学编程的最佳年龄3-5岁的儿童可以先进行少儿编程语言启蒙&#xff0c;正式学习编程建议在上小学后。国外脑科学实证研究表…

messageformat.format() 自定义参数名_DedeCMS的Java版mcms 第四季之一: 自定义插件

自定义mcms插件包含自定义字典、自定义搜索、自定义模型、自定义表单、自定义页面等功能依赖: Apache Maven<dependency><groupId>net.mingsoft</groupId><artifactId>ms-mdiy</artifactId><version>当前版本</version> </de…