干掉配置文件中的明文,提升应用安全!
2021/5/3 10:56:03
本文主要是介绍干掉配置文件中的明文,提升应用安全!,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
几乎所有应用都会配置一些敏感信息,比如生产环境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: 1000 09:55:22.188 [restartedMain] INFO c.u.j.e.DefaultLazyEncryptor - [getProperty,59] - Encryptor config not found for property jasypt.encryptor.poolSize, using default value: 1 09: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,在生产中可以引入更复杂的参数,让你的应用更安全。
后话一:如何生成密文
BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); // 加密所需的salt textEncryptor.setPassword("xxx@yelangking"); // 要加密的数据(数据库的用户名或密码) String username = textEncryptor.encrypt("root"); String password = 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关键代码:
public class EnableEncryptablePropertiesBeanFactoryPostProcessor implements BeanFactoryPostProcessor, ApplicationListener<ApplicationEvent>, Ordered { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 得到加密字符串的处理类(已经加密的密码通过它来解密) EncryptablePropertyResolver propertyResolver = beanFactory.getBean(RESOLVER_BEAN_NAME, EncryptablePropertyResolver.class); // springboot下的Environment里包含了所有我们定义的属性, 也就包含了application.properties中所有的属性 MutablePropertySources propSources = environment.getPropertySources(); // 核心,PropertySource的getProperty(String)方法委托给EncryptablePropertySourceWrapper convertPropertySources(interceptionMode, propertyResolver, propSources); } }
convertPropertySources中实现了具体的解密方法:
@Override public String resolvePropertyValue(String value) { String actualValue = value; // 如果value是加密的value,则进行解密。 if (detector.isEncrypted(value)) { try { actualValue = encryptor.decrypt(detector.unwrapEncryptedValue(value.trim())); } catch (EncryptionOperationNotPossibleException e) { throw new DecryptionException("Decryption of Properties failed, make sure encryption/decryption passwords match", e); } } return actualValue; }
在这里,解释器通过判断是否包含关键字ENC来作为是否加密的标识,如果包含ENC则会进行解密,反之则直接返回明文。
这篇关于干掉配置文件中的明文,提升应用安全!的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-28一步到位:购买适合 SEO 的域名全攻略
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门