Spring boot配置文件加解密详解

功能介绍

大家都知道在Spring boot开发过程中,需要在配置文件里配置许多信息,如数据库的连接信息等,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了,因此需要进行加密处理才行。

在项目中使用jasypt-1.9.4.jar包,能够实现对明文进行加密,对密文进行解密。配置相关加密信息,就能够实现在项目运行的时候,自动把配置文件中已经加密的信息解密成明文,供程序使用

下面话不多说了,来一起看看详细的介绍吧

使用说明

1.pom引入依赖

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

2.配置文件application.yaml

******************加解密相关配置*******************
jasypt:
 encrytor:
 #用来加解密的salt值
 password: 123456
 #用来使用新的算法,默认为org.jasypt.salt.NoOPIVGenerator,这样的话我们就无法使用命令行中生成的密文
 ivGeneratorClassname: org.jasypt.salt.RandomIVGenerator

参数解释:

  • password:加密时候要使用salt值
  • 对于ivGeneratorClassname,jara包中封装类默认为org.jasypt.salt.NoOpIVGenerator,这个时候我们如果使用Junit生成密文,那么只会生成24位密钥,与命令行中用命令生成的不一样,后面会详细讲解。

3.代码解析

首先我们需要知道的事加解密的方法,只有知道了如何加密才能够在配置文件中设置相关参数的密文,这里涉及到两种方式的加密:

a.命令行加密

如果我们项目上线了,需要修改配置文件中的信息,这个时候我们可能要通过命令行的方式去加密(前提:保证你的salt值和你的项目中定义的一致)

I.找到maven仓库本地地址,如:C:\Users\kfzx-xuming\.m2\repository 在这里面找到jasypt-1.9.4.jar所在位置

II.进入文件夹,运行cmd命令

加密:java -cp jasypt-1.9.4.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLIinput=pass1234password=12345algorithm=PBEWithMD5AndDES

参数说明:

  • input:加上需要加密的明文
  • password:加上salt值(需要和项目中的application.yaml的password 一致)
  • algorithm:加上加密算法(默认使用的就是PBEWithMD5AndDES)

这个时候我们可以看到下面的加密结果:

下面的output中就是我们对明文pass1234使用salt值为12345加密的结果

解密:java -cp jasypt-1.9.4.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input=pdFVCKrYnVOkTpeJ+081g70kzVWV2aLrTOK2EjrJkkSNMbu4C4IX+Q== password=12345 algorithm=PBEWithMD5AndDES

这个时候我们可以看到解密结果:

b.在eclipse中用Junit运行代码对明文加密解密

前提已经在配置文件中配置了jasypt相关信息

jasypt提供了封装类StringEncryptor,可以通过代码来加解密,我们可以使用这个类运行相关方法

Junit相关代码:

import org.jasypt.encryption.StringEncryptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static sun.plugin.javascript.navig.JSType.Embed;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class JasyptTest {

 @Autowired
 StringEncryptor encryptor;
 //加密
 @Test
 public void getPass(){
 String name = encryptor.encrypt("hello");
 System.out.println("加密结果:"+name);//解密
 @Test
 public void passDecrypt(){
 String username = encryptor.decrypt("7uBC9fVLpL05ipEPzgsDT6Qcjuq9HvDYc0VUIgP4hY=");
 System.out.println("解密结果:"+username);
 }
}

运行结果如下:

这个时候我们就得到了想要的密文,直接粘贴到配置文件中即可

使用方法如下:

I.在配置文件application.yaml相关位置把明文替换成密文,用ENC()包裹:

************** 加解密相关测试配置信息***************
test:
 code:
 username: ENC(pdFVCKrYnVOkTpeJ+081g70kzVWV2aLrTOK2EjrJkkSNMbu4C4IX+Q==)

II.在相应的位置直接读取使用即可,下面我们写一个controller类测试一下运行解密的效果:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Controller
public class JasyptController {

 @Value("${cmd.username}")
 private String cmdUsername;

 @RequestMapping("/hello")
 public String testJasypt() {
 return cmdUserName;
 }
}

这个时候我们启动项目就能够看到我们再配置中设置的密文对应的明文

至此配置文件的加解密的使用方法就介绍完了

4.补充说明

对于上述配置文件中的ivGeneratorClassname再进行一个详细的介绍

对于上述的Junit中使用的StringEncryptor封装类,他是可以通过读取配置文件中的信息进行加解密相关参数进行初始化,通过阅读远吗,我们可以发现,初始化config的时候会跳转到如下的地方进行设置:

如果在配置参数中没有设置ivGeneratorClassname,那么默认就是org.jasypt.salt.NoOpIVGenerator,那么在运行加解密的时候就会生成一个24位的密文,如图:

但是我们可以看到上面用命令行生成的却比这个厂,这个时候如果我们把命令行中生成的密文粘贴到配置文件中则springboot就会启动不了,Junit也会报错解析,把这个密文用命令解析发现也会报错

这个说明命令行中的加解密不是通过StringEncryptor类来操作的,那是走那边的呢?

通过查阅资料我们发现了下面的代码:

package cn.linjk.ehome;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.junit.Test;

public class JasyptTest {
 @Test
 public void testEncrypt() throws Exception {
 StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
 EnvironmentPBEConfig config = new EnvironmentPBEConfig();

 config.setAlgorithm("PBEWithMD5AndDES");  // 加密的算法,这个算法是默认的
 config.setPassword("12345");   // 加密的密钥
 standardPBEStringEncryptor.setConfig(config);
 String plainText = "hello";
 String encryptedText = standardPBEStringEncryptor.encrypt(plainText);
 System.out.println(encryptedText);
 }
}

这个时候我们运行一下,得到下面的结果:

把这个密文用命令进行解密发现也是成功的,查看源码(下图):可以看出,命令行如果没有设置ivGeneratorClassname那么默认就会new RandomIVGenerator,就是这一步导致了生成了不一样的密文:

综上所述,结合场景,如果我们是项目需要上线了,不方便运行Junit去生成密文,填入配置文件,需要用命令行对明文加密,那一定要在配置文件中设置ivGeneratorClassname值!!!

公司电脑没有办法用外网上,图片用手机拍的,如果感觉模糊,请见谅,大家相互学习~~~~~~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式. 自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方. JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler.其中,Invoc

  • SpringSessionRedis配置及发现的问题讲解

    最近写项目,需要把session放入Redis中,来实现分布式.我本来要用Tomcat部署Redis这种方法,但是依赖于容器了.无意中发现了SpringSession,这可挺不错的,写完了发现不好用,问度娘也没弄明白,最后我写了2个demo一个springMVC的,一个spring整合struts2的,发现SpringSession需要SpringMVC的支持.也就是说我的项目用不了了. 先说说springsession的配置吧: 一.Maven中pom.xml文件中添加(选一种添加上就行):

  • mysql+spring+mybatis实现数据库读写分离的代码配置

    场景:一个读数据源一个读写数据源. 原理:借助spring的[org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource]这个抽象类实现,看名字可以了解到是一个路由数据源的东西,这个类中有一个方法 /** * Determine the current lookup key. This will typically be * implemented to check a thread-bound transaction

  • springmvc配置线程池Executor做多线程并发操作的代码实例

    加载xml文件 在ApplicationContext.xml文件里面添加 xmlns:task="http://www.springframework.org/schema/task" xmlns文件并且xsi:schemaLocation中添加 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd 在spring中配置Executor

  • Spring集成jedis的配置与使用简单实例

    jedis是redis的java客户端,spring将redis连接池作为一个bean配置. redis连接池分为两种,一种是"redis.clients.jedis.ShardedJedisPool",这是基于hash算法的一种分布式集群redis客户端连接池. 另一种是"redis.clients.jedis.JedisPool",这是单机环境适用的redis连接池. maven导入相关包: <!-- redis依赖包 --> <depende

  • Spring各版本新特性的介绍

    Spring各个版本新特性 Spring3.1新特性 1.添加了引入环境profile功能 2.添加了@enable注解,使用特定功能 3.添加了对声明式缓存的支持,能够使用简单的注解声明缓存边界和规则 4.添加的用于构造器注入的c命名空间,类似与Spring2的p命名空间,用于对应属性注入 5.开始支持Servlet3.0,包括基于java配置中生命Servlet和Filter,不再只仅仅借助web.xml 6.改善对于JPA的支持,让JPA能在Spring中完整配置JPA,不必再使用pers

  • Spring线程池ThreadPoolExecutor配置并且得到任务执行的结果

    用ThreadPoolExecutor的时候,又想知道被执行的任务的执行情况,这时就可以用FutureTask. ThreadPoolTask package com.paul.threadPool; import java.io.Serializable; import java.util.concurrent.Callable; public class ThreadPoolTask implements Callable<String>, Serializable { private s

  • Spring框架十一种常见异常的解决方法汇总

    在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/herman/ss/controller];

  • Spring Boot中使用Spring-data-jpa的配置方法详解

    为了解决这些大量枯燥的数据操作语句,我们第一个想到的是使用ORM框架,比如:hibernate.通过整合Hibernate之后,我们以操作Java实体的方式最终将数据改变映射到数据库表中. 为了解决抽象各个Java实体基本的"增删改查"操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现.虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的

  • SpringBoot thymeleaf eclipse热部署方案操作步骤

    网上找了好多的springboot热部署方案,也尝试了好几种方法,下面是我的成功方案跟大家分享 操作步骤 1.pom中添加热部署依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency&g

随机推荐