使用 Jasypt 保护数据库配置
一、概述
Jasypt 是一个Java库,允许开发人员以很简单的方式添加基本加密功能,而无需深入研究加密原理。其具有以下特性:
1、高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件...
2、集成Hibernate的。
3、可集成到Spring应用程序中,与Spring Security集成。
4、集成的能力,用于加密的应用程序(即数据源)的配置。
5、特定功能的高性能加密的multi-processor/multi-core系统。
6、与任何JCE提供者使用开放的API。
这里主要讲述与Spring应用程序集成方法。
二、操作步骤
1、加密密码
从 Jasypt 官网,下载压缩包,解压到本地磁盘目录。在 /jasypt-1.9.2/bin 目录下有8个文件,encrypt.sh 加密、decrypt.sh 解密。可输入该命令回车,回显命令的具体参数信息。下面演示如何加密、解密一个密码串。
首先演示加密明文密码串为密文:
[root@oracle ~]#encrypt input=root123 password=::Lazy@8 algorithm=PBEWITHMD5ANDDES
----ENVIRONMENT-----------------
Runtime: Sun Microsystems Inc. Java HotSpot(TM) Client VM 20.6-b01
----ARGUMENTS-------------------
algorithm: PBEWITHMD5ANDDES
input: root123
password: ::Lazy@8
----OUTPUT----------------------
SPtOOLMF8Ildm8TqEaQAuA==
其中,input参数为需要加密的密码,password参数后加密密码,algorithm参数为所用的算法,加密后的输出值为 SPtOOLMF8Ildm8TqEaQAuA==
接下来演示解密密文为明文密码串:
[root@oracle ~]#decrypt input=SPtOOLMF8Ildm8TqEaQAuA== password=::Lazy@8 algorithm=PBEWITHMD5ANDDES
----ENVIRONMENT-----------------
Runtime: Sun Microsystems Inc. Java HotSpot(TM) Client VM 20.6-b01
----ARGUMENTS-------------------
algorithm: PBEWITHMD5ANDDES
input: SPtOOLMF8Ildm8TqEaQAuA==
password: ::Lazy@8
----OUTPUT----------------------
root123
将上面加密的密码置换到 input 参数后面,使用 decrypt 命令,则将密文,解密为明文 root123。
2、配置外部文件
在 src/main/resources 目录下新建jdbc.properties 文件,内容如下:
1 ds.driverClassName=com.mysql.jdbc.Driver 2 ds.url=jdbc:mysql://10.108.1.97:3306/test?useUnicode=true&characterEncoding=UTF-8 3 ds.username=scott 4 ds.password=ENC(SPtOOLMF8Ildm8TqEaQAuA==)
需要注意到第四行配置格式。
3、配置环境变量
设置环境变量 APP_ENCRYPTION_PASSWORD=::Lazy@8
4、配置Spring
1 <bean id="environmentStringPBEConfig" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> 2 <property name="algorithm" value="PBEWITHMD5ANDDES" /> 3 <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" /> 4 </bean> 5 <bean id="standardPBEStringEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> 6 <property name="config" ref="environmentStringPBEConfig" /> 7 </bean> 8 <bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer"> 9 <constructor-arg ref="standardPBEStringEncryptor" /> 10 <property name="locations"> 11 <list> 12 <value>classpath:jdbc.properties</value> 13 </list> 14 </property> 15 </bean> 16 17 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 18 <property name="driverClassName" value="${ds.driverClassName}" /> 19 <property name="url" value="${ds.url}" /> 20 <property name="username" value="${ds.username}" /> 21 <property name="password" value="${ds.password}" /> 22 </bean>
org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig 基于环境变量配置加密方式,指定按 PBEWITHMD5ANDDES 算法加密,机密密码来自于环境变量 APP_ENCRYPTION_PASSWORD 的值。这里,有人可能就有疑问了,按照这个方式,有加密密码,那么破解不是很容易了,因为加密密码直接暴露出来了啊。嘿嘿,需要说明的是,当应用程序启动以后,此 环境变量,可直接删除,那么就可以了。
org.jasypt.encryption.pbe.StandardPBEStringEncryptor 标准串加密器,策略来源于 EnvironmentStringPBEConfig。
org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer 占位符配置,指定加密器和占位符对应的配置文件。
薔薇猛虎皆成個性,陽光雨露俱是天恩!