SpringBoot使用Jasypt对配置文件加密、数据库密码加密

本文主要是介绍SpringBoot使用Jasypt对配置文件加密、数据库密码加密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Dmo源码请点这里!

在做数据库敏感信息保护时,Web应用配置的账号密码,在配置文件应加密存储,禁止使用明文账号密码,这时我们可以使用Jasypt加密来实现需求。

一、Jasypt简介


Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。

1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。

2、在程序界有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中使用特定格式直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。

1)Jasypt 加密属性配置格式:

spring:datasource:password: ENC(o6L5p3ymfSMiscyR9CPio4NfGPg+W9==)

ENC() 就是它的标识,程序启动的时候,会自动解密其中的内容,如果解密失败,则会报错。
2)所以获取这些属性值和平时没有区别,直接使用如 @Value(“${spring.datasource.password}”) 获取即可,取值并不需要特殊处理。

3、jasypt 同一个密钥(secretKey)对同一个内容执行加密,每次生成的密文都是不一样的,但是根据根据这些密文解密成原内容都是可以的.

4、Jasypt 官方使用文档:http://www.jasypt.org/
GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot。

二、集成方法

官网上推荐的集成到SpringBoot项目中,有3种方法分别是:

  • 如果使用@SpringBootApplication或@EnableAutoConfiguration,则仅需要添加jasypt-spring-boot-starter启动器jar到您的类路径中即可,它自动会在整个 Spring 环境中启用可加密属性。
  • 添加jasypt-spring-boot到您的类路径并添加@EnableEncryptableProperties到您的主配置类以在整个 Spring 环境中启用可加密属性。
  • 添加jasypt-spring-boot到您的类路径并使用@EncrytablePropertySource注解声明单独的可加密属性源。

2.1 方式一

在Springboot应用程序中,如果使用了@SpringBootApplication 或者@EnableAutoConfiguration注解,则可以在pom文件中添加jasypt-spring-boot-starter依赖,然后就可以在整个Spring环境中使用jasypt对属性进行加解密操作(属性包括:系统属性、环境属性、命令行参数、application.properties、application-*.properties、yml属性以及任何其他属性源)。

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><!-- JDK9+用3.x版本,JDK8用2.x版本 --><!-- 仓库:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ --><version>2.1.2</version>
</dependency>

2.2 方式二

如果项目中没有使用到@SpringBootApplication 或者@EnableAutoConfiguration 自动配置注解,则可以通过以下两个步骤完成对Jasypt的集成。

步骤一:pom文件引入jasypt-spring-boot依赖

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot</artifactId><!-- JDK9+用3.x版本,JDK8用2.x版本 --><!-- 仓库:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ --><version>2.1.2</version>
</dependency>


步骤二:在配置类中,添加@EnableEncryptableProperties注解,示例如下:

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;@SpringBootApplication
@EnableEncryptableProperties
public class MySpringBootApp {public static void main(String[] args) {SpringApplication.run(MySpringBootApp.class, args);}
}


通过这种方式,你的项目一样可以集成Jasypt,并且可加密属性也可以在整个Spring环境中启用属性包括:系统属性、环境属性、命令行参数、application.properties、application-*.properties、yml属性以及任何其他属性源)。

2.3 方式三

如果项目中没有使用到@SpringBootApplication 或者@EnableAutoConfiguration 自动配置注解,又不想在整个Spring环境中启用加密的属性,则可以使用该种方式,具体步骤如下:

步骤一:pom文件引入jasypt-spring-boot依赖

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot</artifactId><!-- JDK9+用3.x版本,JDK8用2.x版本 --><!-- 仓库:https://repo1.maven.org/maven2/com/github/ulisesbocchio/jasypt-spring-boot-starter/ --><version>2.1.2</version>
</dependency>


步骤二、在配置类中,使用@EncryptablePropertySource注解添加任意数量想要生效加密属性的配置文件路径,与Spring中@PropertySource注解的使用类似,示例如下:

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {...
}


同时,还可以使用@EncryptablePropertySources 注解对@EncryptablePropertySource配置进行分组,示例如下:

@Configuration
@EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),@EncryptablePropertySource("classpath:encrypted2.properties")})
public class MyApplication {...
}


说明:从Jasypt 1.8版本开始,@EncryptablePropertySource注解支持配置YAML文件。

三、Springboot整合Jasypt实战

Dmo源码请点这里!

3.1 引入依赖

本Demo使用JDK8,所有依赖2.1.2版本

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.4.RELEASE</version></dependency><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency></dependencies>

3.2 准备加密后的数据

    @Testpublic void test() {BasicTextEncryptor textEncryptor = new BasicTextEncryptor();// 加密秘钥(盐值)textEncryptor.setPassword("jasyptSalt123");// 对账号加密String encUsername = textEncryptor.encrypt("zhangsan");System.out.println(encUsername);// 对密码加密String encPassword = textEncryptor.encrypt("abc123@test");System.out.println(encPassword);}

3.3 配置文件使用加密数据

spring:datasource:# 明文账号密码username: zhangsanpassword: abc123@test# 加密后的账号密码encUsername: ENC(CsXfWspTjwzJ99zeeXhNAk7Jk0/XbeTp)encPassword: ENC(SZqTzbJYCOCErUYWDHdSrXC1Mb/wNYSB)# jasypt加密秘钥,需要从配置文件中删除,改为在项目启动命令上配置环境参数
jasypt:encryptor:password: jasyptSalt123


3.4 直接获取解密数据

@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class SamProperties {private String username;private String password;// 配置注入前会自动解密private String encUsername;private String encPassword;
}


四、拓展

4.1 关于加解密秘钥如何存储

如果秘钥写在代码或者配置文件,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,这样对敏感信息加密的作用就不存在了,因此,秘钥不能以明文形式存储在代码或者配置文件中,应该在应用部署时通过变量传入。

java -Djasypt.encryptor.password=秘钥 -jar xxx.jar或:java -jar xxx.jar --jasypt.encryptor.password=秘钥

4.2 使用jasypt3.0启动时报

使用jasypt3.0启动时报:Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String

官方描述,3.0后默认支持的算法为PBEWITHHMACSHA512ANDAES_256 ,该种加密方式由sha512 加 AES 高级加密组成,需要JDK1.9以上支持或者添加JCE(Java Cryptography Extension无限强度权限策略文件)支持,否则运行会出现错误。

4.2.1 解决方案1,降低版本
降低jasypt的版本 - 使用2.x的版本

4.2.2 解决方案2,修改算法
将加密算法替换成PBEWithMD5AndDES 算法,并配置iv-generator-classname: 为org.jasypt.iv.NoIvGenerator值

这篇关于SpringBoot使用Jasypt对配置文件加密、数据库密码加密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341757

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数