干掉配置文件中的明文,提升应用安全!

简介: 几乎所有应用都会配置一些敏感信息,比如生产环境mysql数据库的用户名和密码,生产redis的密码,生产机器es的密码,甚至于服务器的root密码等等。试想如果是一个发布在互联网的应用,假如这些配置信息被恶意劫持,用户信息被随意泄露,企业有可能因此被摁在地上摩擦,

几乎所有应用都会配置一些敏感信息,比如生产环境mysql数据库的用户名和密码,生产redis的密码,生产机器es的密码,甚至于服务器的root密码等等。试想如果是一个发布在互联网的应用,假如这些配置信息被恶意劫持,用户信息被随意泄露,企业有可能因此被摁在地上摩擦,除了跑路还有其它的选择吗?


通常情况下,除了防止直接在生产上暴露真实密码,还有内部用户误操作,研发的同学会将关键信息进行加密,防止恶意偷窥。本文将以springoot为例,讲解如何在springboot中将配置文件的敏感信息进行加密。


加解密技术是一门精妙的数学艺术,本文不在加解密算法上进行深入讲解,只从工程应用的层面,阐述jasypt加解密技术在springboot项目中的应用,jasypt不局限与springboot,也可以在传统spring项目中引用。跟随下面的步骤来加密你的应用。


第一步:jasypt maven引用

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

用starter的方式集成最简单,在springboot项目启动时会自动集成加解密功能,无需在启动函数上定义相关注解,是最简单的一种集成方式。

第二步:在yml中定义秘钥

#jasypt加解密jasypt:  encryptor:    password = xxx@yelangking

注意,以上秘钥要特别注意保密,jasypt 是对称加密,这个秘钥一定要保存好,可以设置得比较复杂。

第三步:关键信息加密

master:    url: jdbc:mysql://localhost:3306/ry0320?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: ENC(cj0tF0M9/cFdu69HL2EyAQ==)
    password: ENC(G2EMSuKtH3sBA5bHrjmtZg==)

所有需要加密的关键信息都冠以ENC(XXX),XXX为加密后的密文。

通过以上步骤就可以完成关键信息加密,直接启动应用就可以了。是不是很简单,通过这些简单的集成,可以有效避免这些配置信息在机器上裸奔。

启动日志如下:

09:55:22.154 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [lambda$new$2,33] - String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
09:55:22.185 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWithMD5AndDES
09:55:22.186 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.keyObtentionIterations, using default value: 100009:55:22.188 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.poolSize, using default value: 109:55:22.189 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.providerName, using default value: null
09:55:22.190 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.providerClassName, using default value: null
09:55:22.191 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.saltGeneratorClassname, using default value: org.jasypt.salt.RandomSaltGenerator
09:55:22.194 [restartedMain] INFO  c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.stringOutputType, using default value: base64

上述日志是因为没有配置相关参数,springboot帮我们生成了默认的bean,在生产中可以引入更复杂的参数,让你的应用更安全。

后话一:如何生成密文

BasicTextEncryptortextEncryptor=newBasicTextEncryptor();
// 加密所需的salttextEncryptor.setPassword("xxx@yelangking");
// 要加密的数据(数据库的用户名或密码)Stringusername=textEncryptor.encrypt("root");
Stringpassword=textEncryptor.encrypt("mysql");
System.out.println("username:"+username);
System.out.println("password:"+password);
// 要解密的数据(数据库的用户名或密码)username=textEncryptor.decrypt(username);
password=textEncryptor.decrypt(password);
System.out.println("username:"+username);
System.out.println("password:"+password);

以上代码可以用main方法运行,也可以使用junit完成。

后话二:springboot深入集成jasypt关键代码:

publicclassEnableEncryptablePropertiesBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor, ApplicationListener<ApplicationEvent>, Ordered {
@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory) throwsBeansException {
// 得到加密字符串的处理类(已经加密的密码通过它来解密)EncryptablePropertyResolverpropertyResolver=beanFactory.getBean(RESOLVER_BEAN_NAME, EncryptablePropertyResolver.class);
// springboot下的Environment里包含了所有我们定义的属性, 也就包含了application.properties中所有的属性MutablePropertySourcespropSources=environment.getPropertySources();
// 核心,PropertySource的getProperty(String)方法委托给EncryptablePropertySourceWrapperconvertPropertySources(interceptionMode, propertyResolver, propSources);
    }
}

convertPropertySources中实现了具体的解密方法:

@OverridepublicStringresolvePropertyValue(Stringvalue) {
StringactualValue=value;
// 如果value是加密的value,则进行解密。if (detector.isEncrypted(value)) {
try {
actualValue=encryptor.decrypt(detector.unwrapEncryptedValue(value.trim()));
        } catch (EncryptionOperationNotPossibleExceptione) {
thrownewDecryptionException("Decryption of Properties failed,  make sure encryption/decryption passwords match", e);
        }
    }
returnactualValue;
}

在这里,解释器通过判断是否包含关键字ENC来作为是否加密的标识,如果包含ENC则会进行解密,反之则直接返回明文。

目录
相关文章
|
10月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
693 3
Jasypt加密数据库配置信息
|
存储 安全 Java
Spring Boot中的配置文件加密
Spring Boot中的配置文件加密
|
安全 Java Maven
SpringBoot如何防止反编译?proguard+xjar 完美搞定
【8月更文挑战第10天】在软件开发过程中,保护源代码不被反编译是确保应用安全性的重要一环。对于使用Spring Boot框架的项目来说,防止反编译尤为重要。本文将详细介绍如何使用ProGuard和xjar这两种工具来增强Spring Boot项目的安全性,防止代码被恶意反编译。
2969 8
|
10月前
|
人工智能 索引 Python
[oeasy]python094_使用python控制音符列表_midi_文件制作
本文介绍了如何使用Python控制音符列表制作MIDI文件。首先回顾了列表下标索引(正数和负数)的用法,接着通过`mido`库实现MIDI文件生成。以《两只老虎》为例,详细解析了代码逻辑:定义音高映射、构建旋律列表、创建MIDI文件框架,并将音符插入音轨。还探讨了音符时值与八度扩展的实现方法。最终生成的MIDI文件可通过不同平台播放或编辑。总结中提到,此技术可用于随机生成符合调性的旋律,同时引发对列表其他实际应用的思考。
360 5
|
Web App开发 安全 数据安全/隐私保护
WEB应用安全评估标准- OWASP ASVS的整理介绍
今天完善了ASVS的PPT。整理成WORD了。 WEB应用安全评估标准- OWASP  ASVS  (Application Security Verification Standard) 一、什么是ASVS uThe OWASP Appl...
3182 0
|
开发工具 对象存储 数据安全/隐私保护
【OSS最佳实践】浅谈OSS权限控制
OSS的权限控制可以分为OSS本身的权限控制及账户级别权限控制;OSS本身的权限又可以针对bucket级别及object级别进行设置;账户级别权限控制可细分为:主账户、子账户、STS临时账户对OSS的权限控制;本文将对以上内容进行展开介绍并且介绍常见问题及排查思路;
13005 0
【OSS最佳实践】浅谈OSS权限控制
|
机器学习/深度学习 存储 计算机视觉
基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测
基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测
|
关系型数据库 MySQL
子查询中有个不存在的列居然不报错是bug吗?
问题描述 有开发问我这样一个问题: mysql&gt; select * from aaa; +----+---------------------+----------+---------------------+ | id | dt | name | dtt.
2606 0
|
安全 Java API
阿里云短信服务对接流程
阿里云短信服务是阿里巴巴集团推出的一款通讯服务产品,支持发送短信到手机、验证码短信、语音短信等多种短信场景。通过阿里云短信服务,企业可以方便、快捷、安全地将消息发送给用户,提升用户体验和品牌形象。此外,阿里云短信服务还提供了丰富的API接口和SDK,方便开发者集成到自己的应用中。 基本上我们的生活已经不能脱离阿里云短信服务了,比如注册一个APP,登录一个APP,或者找回密码等。但是很多小白用户不知道怎么使用阿里云短信,下面小编就和大家系统讲解一下