Spring Boot: 加密应用配置文件敏感信息
2018-09-19 17:01
1081 查看
Spring Boot: 加密应用配置文件敏感信息
背景
- 我们的应用之前使用的是Druid数据库连接池,由于需求我们迁移到HikariCP连接池,druid 数据源加密提供了多种方式:
- 可以在配置文件my.properties中指定config.decrypt=true
- 也可以在DruidDataSource的ConnectionProperties中指定config.decrypt=true
- 也可以在jvm启动参数中指定-Ddruid.config.decrypt=true
但是HikariCP 默认没有提供实现数据源加解密的方法
- 应用中会存在多个需要配置敏感信息(比如stfp等),都需要加密,类似于druid加解密方式依赖于工具类的实现,没有统一的加解密标准,麻烦、而且不好维护。
case1:Spring Cloud Config 的解决方案
- Config Server 加解密依赖JDK的JCE。
- 配置config serve encrypt.key=foo
- 使用config server 提供的加解密接口生成密文
curl localhost:4001/encrypt -d lengleng 密文
- 配置文件使用密文
spring: datasource: password: '{ciper}密文' xxx: '{ciper}密文'
其他的非对称加密等高级配置,参考官方文档。注意一个bug (No key was installed for encryption service)
case2:jasypt 的解决方案
一,首先引入Maven/Gradle 依赖
Maven
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>1.14</version> </dependency>
或
Gradle
compile 'com.github.ulisesbocchio:jasypt-spring-boot-starter:1.14'
2.1.0版本是我用的时候最新版本。查看最新版本可以到 https://github.com/ulisesbocchio/jasypt-spring-boot 查看
二,application.yml配置文件中增加如下内容(加解密时使用)
#jasypt加密的密匙 jasypt: encryptor: password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7
三,在测试用例中生成加密后的秘钥:
- 创建我们一个工具包JasyptUtils
package com.testPro; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.StandardPBEByteEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; import org.junit.Test; public class JasyptUtils { /** * Jasypt生成加密结果 * * @param password 配置文件中设定的加密密码 jasypt.encryptor.password * @param value 待加密值 * @return */ public static String encryptPwd(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)); String result = encryptOr.decrypt(value); return result; } public static SimpleStringPBEConfig cryptOr(String password) { SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(password); config.setAlgorithm(StandardPBEByteEncryptor.DEFAULT_ALGORITHM); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setStringOutputType("base64"); return config; } @Test public void test() { String jasyptPassword = "123456";//盐值 // 加密 System.out.println("###encryptPwd:" + encryptPwd(jasyptPassword, "appserver123")); // 解密 System.out.println("###decyptPwd:" + decyptPwd(jasyptPassword, "SaYJ7DkUlL3gxzt4zrNG4t0lGXzk9x9C")); } }
四,将上面生成的name和password替换配置文件中的数据库账户和密码,替换后如下:
--格式:[/code]
[code]spring:
datasource:
password: ENC(DBA提供的密文)
注意上面的 ENC()是固定写法,()里面是加密后的信息。
spring: #数据库相关配置 datasource: driver-class-name: com.mysql.jdbc.Driver #这里加上后缀用来防止mysql乱码,serverTimezone=GMT%2b8设置时区 url: ENC(i87lLC0ceVq1vK91R+Y6M9fAJQdU7jNp5MW+ndLgacRvPDj42HR8mUE33uFwpWqjOSuDX0d1dd2NilrnW7yJbZmoxuJ3HmOmjwY5+Vhu+e3We4QPDVCr/s/RHsQgYOiWrSQ92Mjammnody/jWI5aaw==) username: appserver password: ENC(SaYJ7DkUlL3gxzt4zrNG4t0lGXzk9x9C) #appserver123 jpa: hibernate: ddl-auto: update show-sql: true #返回的api接口的配置,全局有效 jackson: default-property-inclusion: non_null #如果某一个字段为null,就不再返回这个字段 #url相关配置,这里配置url的基本url server: port: 8888 #jasypt加密的密匙(盐值) jasypt: encryptor: password: 123456
其他非对称等高级配置参考
[code]
[/code]
Key Required Default Value jasypt.encryptor.password True - jasypt.encryptor.algorithm False PBEWithMD5AndDES jasypt.encryptor.keyObtentionIterations False 1000 jasypt.encryptor.poolSize False 1 jasypt.encryptor.providerName False SunJCE jasypt.encryptor.saltGeneratorClassname False null jasypt.encryptor.saltGeneratorClassname False org.jasypt.salt.RandomSaltGenerator jasypt.encryptor.stringOutputType False base64 jasypt.encryptor.proxyPropertySources False false
总结
- Spring Cloud Config 提供了统一的加解密方式,方便使用,但是如果应用配置没有走配置中心,那么加解密过滤是无效的;依赖JCE 对于低版本spring cloud的兼容性不好。
- jasypt 功能更为强大,支持的加密方式更多,但是如果多个微服务,需要每个服务模块引入依赖配置,较为麻烦;但是功能强大 、灵活。
- 个人选择 jasypt
- 源码参考: 基于Spring Cloud、JWT 的微服务权限系统设计
- https://segmentfault.com/a/1190000012363841
- https://www.jianshu.com/p/b047ed4a8dfa
- https://zhiku8.com/springboot-jasypt.html
相关文章推荐
- Spring Boot: 加密应用配置文件敏感信息
- Jasypt : 整合spring boot加密应用配置文件敏感信息
- 利用Jasypt如何对Spring Boot配置文件加密
- SpringBoot+spring-date-jpa+Hibernate 整合mysql 与sqlserver 配置文件信息
- 11-Spring Boot ( 获取配置文件信息 )
- Eclipse安装了SpringSource Tool Suite插件后,编辑SpringBoot项目的yml配置文件仍然没有提示信息的解决办法
- SpringBoot 不同环境读取不同的配置信息文件
- spring 配置中,数据库相关信息如何加密放在属性文件中
- SpringBoot中加密包对配置文件中的密码进行加密
- spring boot 读取配置文件信息
- SpringBoot+spring-date-jpa+Hibernate 整合mysql 与sqlserver 配置文件信息
- SpringCloud系列九:SpringCloudConfig 基础配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服务端、抓取配置文件信息、客户端使用 SpringCloudConfig 进行配置、单仓库目录匹配、应用仓库自动选择、仓库匹配模式)
- 采用DES加密方式对properties配置文件敏感信息加密处理
- 侧信道(Side Channel)攻击对加密Web应用造成的敏感信息泄露
- 加密网站配置文件中的信息
- 在weblogic下部署web应用,加载spring配置文件时要删除注释
- 通过Spring读取properties配置文件的信息 Spring 读取properties
- 对于应用终止的控制。用配置文件,实时读取某个信息,控制应用在恰当的时机停止
- JavaWeb_Servlet_应用_读取文件配置信息
- 如何在spring中读取properties配置文件里面的信息