1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 使用Jasypt加密spring boot应用配置文件的敏感信息

使用Jasypt加密spring boot应用配置文件的敏感信息

时间:2022-08-20 12:42:23

相关推荐

使用Jasypt加密spring boot应用配置文件的敏感信息

Jasypt是一个Java库,允许开发人员以很简单的方式添加基本加密功能,而无需深入研究加密原理。利用它可以实现高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件。

使用jasypt:

1、引入jasypt的maven依赖:

<!-- Jasypt加密 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.0</version></dependency>

2.开发环境中可以编写一个工具类对需要加密的字符串进行加密

import lombok.extern.slf4j.Slf4j;import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;@Slf4jpublic class JasyptUtil {/*** Jasypt生成加密结果* @param password 配置文件中设定的加密密码 jasypt.encryptor.password* @param value 待加密值* @return*/public static String encyptPwd(String password,String value){PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();encryptor.setConfig(cryptor(password));String result = encryptor.encrypt(value);return result;}/*** 解密* @param password 设置盐值(加密解密密钥) jasypt.encryptor.password* @param value 待解密密文* @return*/public static String decyptPwd(String password,String value){PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();encryptor.setConfig(cryptor(password));encryptor.decrypt(value);String result = encryptor.decrypt(value);return result;}public static SimpleStringPBEConfig cryptor(String password){SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(password);config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize(1);config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");return config;}public static void main(String[] args){//加密 若修改了第一个参数加密password记得在配置文件同步修改System.out.println("加密后:"+encyptPwd("xiaomifeng1010","123456"));//解密System.out.println("解密后:"+decyptPwd("xiaomifeng1010","jWdJUXTpRZPAIyBwH5cC4gLiY/CA++A6VMoOrXl1EjOu2SUiONUDA/trq8fjpG/i"));}}

例如,现在需要对application.yml配置文件中的数据库连接的用户密码进行加密:

# 设置盐值(加密解密密钥), 生产环境中可通过环境变量、命令行等形式进行设置jasypt:encryptor:password: xiaomifeng1010server:port: 8888servlet:context-path: /tomcat:uri-encoding: UTF-8max-threads: 1000min-spare-threads: 30spring:# 数据源datasource:url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: root# Jasypt加密 可到common-utils中找到JasyptUtil加解密工具类生成加密结果 格式为ENC(加密结果) 以下解密结果为123456password: ENC(s1IqO0kn3jDReVSk7ZLiHOVxsTN89nm/exox2AhdtG1sH2Jd7PEXIILoS4YenkuP)type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.DriverlogSlowSql: true# Druid StatViewServlet配置druid:stat-view-servlet:# 默认true 内置监控页面首页/druid/index.htmlenabled: trueurl-pattern: /druid/*# 允许清空统计数据reset-enable: truelogin-username: rootlogin-password: ENC(s1IqO0kn3jDReVSk7ZLiHOVxsTN89nm/exox2AhdtG1sH2Jd7PEXIILoS4YenkuP)# IP白名单 多个逗号分隔allow:# IP黑名单deny:filter:stat:# 显示慢sql 默认当超过3秒显示log-slow-sql: truejpa:# 显示sqlshow-sql: true# 自动生成表结构generate-ddl: truehibernate:ddl-auto: update# Redisredis:host: 127.0.0.1password:# 数据库索引 默认0database: 0port: 6379# 超时时间 Duration类型 3秒timeout: 3S# Elasticsearchdata:elasticsearch:client:reactive:# 要连接的ES客户端 多个逗号分隔endpoints: 127.0.0.1:9300# 暂未使用ES 关闭其持久化存储repositories:enabled: false

我本地的mysql数据库连接的用户密码是:123456

于是使用刚才的工具类加密一下123456

可以看到使用Jasypt加密同样的字符串,每次得到的结果并不一样,main方法中的解密输出中的值,和这次加密后的值不相同,那是因为main方法中解密输出的值是上次生成的。但是还是可以成功解密为:123456

字符串“xiaomifeng1010”相当于加密的一个密钥(或者称其为盐值)的作用。

加密后的结果:s1IqO0kn3jDReVSk7ZLiHOVxsTN89nm/exox2AhdtG1sH2Jd7PEXIILoS4YenkuP放在配置文件application.yml中,密码部分使用ENC()包裹。

之后像往常一样使用@Value("${}")获取该配置即可,获取的是解密之后的值。

在生产环境中可通过环境变量、命令行等形式进行设置。

本身加解密过程都是通过盐值进行处理的,所以正常情况下盐值加密串是分开存储的。盐值应该放在系统属性命令行或是环境变量来使用,而不是放在同一个配置文件里面。

命令行存储方式示例:

java -jar xxx.jar --jasypt.encryptor.password=xxx &;

环境变量存储方式示例:

设置环境变量(linux):

# 打开/etc/profile文件vim /etc/profile# 文件末尾插入export JASYPT_PASSWORD = xxxx

启动命令:

java -jar xxx.jar --jasypt.encryptor.password=${JASYPT_PASSWORD} &;

说明:加密的时候,当然也可以不使用工具类,在开发过程中,自己写bat脚本:

@echo offset/p input=待加密的明文字符串:set/p password=加密密钥(盐值):echo 加密中......java -cp jasypt-3.0.0.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI ^input=%input% password=%password% ^algorithm=PBEWithMD5AndDESpause

使用 jasypt-3.0.0.jar中的org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI类进行加密input参数是待加密的字符串,password参数是加密的密钥(盐值)使用PBEWithMD5AndDES算法进行加密

注意:jasypt-3.0.0.jar文件需要和bat脚本放在相同目录下

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。