Java 实现加密数据库连接的步骤
作者:月光中的污点
原文链接:https://www.extlight.com/2017/12/16/Java-%E5%AE%9E%E7%8E%B0%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5/
一、前言
在很多项目中,数据库相关的配置文件内容都是以明文的形式展示的,这存在一定的安全隐患。
在开发和维护项目时,不仅要关注项目的性能,同时也要注重其安全性。
二、实现思路
我们都知道项目启动时,Spring容器会加载配置文件并读取文件中的内容,那么我们可以下边步骤操作:
通过DES算法加密连接数据库的账号和密码并将加密后的密文写到db配置文件中。
在Spring读取db配置文件时将密文解密回明文。
三、实现编码
3.1加密工具类
DESUtil类:
publicclassDESUtil{
privatestaticKeykey;
privatestaticStringKEY_STR="myKey";
privatestaticStringCHARSETNAME="UTF-8";
privatestaticStringALGORITHM="DES";
static{
try{
KeyGeneratorgenerator=KeyGenerator.getInstance(ALGORITHM);
SecureRandomsecureRandom=SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(KEY_STR.getBytes());
generator.init(secureRandom);
key=generator.generateKey();
generator=null;
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
/**
*加密
*@paramstr
*@return
*/
publicstaticStringgetEncryptString(Stringstr){
BASE64Encoderbase64encoder=newBASE64Encoder();
try{
byte[]bytes=str.getBytes(CHARSETNAME);
Ciphercipher=Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[]doFinal=cipher.doFinal(bytes);
returnbase64encoder.encode(doFinal);
}catch(Exceptione){
//TODO:handleexception
thrownewRuntimeException(e);
}
}
/**
*解密
*@paramstr
*@return
*/
publicstaticStringgetDecryptString(Stringstr){
BASE64Decoderbase64decoder=newBASE64Decoder();
try{
byte[]bytes=base64decoder.decodeBuffer(str);
Ciphercipher=Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE,key);
byte[]doFinal=cipher.doFinal(bytes);
returnnewString(doFinal,CHARSETNAME);
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
}
通过上边的工具类对连接数据库的账号密码进行加密。笔者主机上连接数据库的账号和密码分别是“root”和“tiger”。
经过加密后得到“WnplV/ietfQ=”和“xyHEykQVHqA=”。
db.properties配置文件完整内容如下:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=UTC jdbc.username=WnplV/ietfQ= jdbc.password=xyHEykQVHqA=
3.2配置文件解析类
EncryptPropertyPlaceholderConfigurer类:
publicclassEncryptPropertyPlaceholderConfigurerextendsPropertyPlaceholderConfigurer{
//需要解密的字段
privateString[]encryptPropNames={"jdbc.username","jdbc.password"};
@Override
protectedStringconvertProperty(StringpropertyName,StringpropertyValue){
if(isEncryptProp(propertyName)){
//解密
StringdecryptValue=DESUtil.getDecryptString(propertyValue);
returndecryptValue;
}else{
returnpropertyValue;
}
}
privatebooleanisEncryptProp(StringpropertyName){
for(StringencryptpropertyName:encryptPropNames){
if(encryptpropertyName.equals(propertyName))
returntrue;
}
returnfalse;
}
}
3.3Spring配置文件
applicationContext-mybatis.xml部分内容:
classpath:db.properties
未加密明文前,使用的是
加密明文后,使用配置文件解析类加载db配置文件。
完成上述3个步骤后按照往常操作,直接运行项目即可。
四、总结
起初,在不了解实现思路前觉得这功能很神秘和高大尚。但是,理清思路后功能实现起来就非常简单了。
作为程序员不能被神秘的表象惊叹而“望而却步”,需要学会思考和理清思路,这样才能不断提升自身能力。
以上就是Java实现加密数据库连接的步骤的详细内容,更多关于Java实现加密数据库连接的资料请关注毛票票其它相关文章!