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实现加密数据库连接的资料请关注毛票票其它相关文章!