springboot项目数据库密码怎么实现加密-mile米乐体育
springboot项目数据库密码怎么实现加密
这篇文章主要介绍了springboot项目数据库密码怎么实现加密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot项目数据库密码怎么实现加密文章都会有所收获,下面我们一起来看看吧。
方案一、使用druid数据库连接池对数据库密码加密
1、pom.xml引入druid包
为了方便其他的操作,这边直接引入druid的starter
2、利用com.alibaba.druid.filter.config.configtools生成公私钥
ps: 生成的方式有两种,一种利用命令行生成,一种直接写个工具类生成。本文示例直接采用工具类生成
工具类代码如下
/***alibabadruid加解密规则:*明文密码 私钥(privatekey)加密=加密密码*加密密码 公钥(publickey)解密=明文密码*/publicfinalclassdruidencryptorutils{privatestaticstringprivatekey;privatestaticstringpublickey;static{try{string[]keypair=configtools.genkeypair(512);privatekey=keypair[0];system.out.println(string.format("privatekey-->%s",privatekey));publickey=keypair[1];system.out.println(string.format("publickey-->%s",publickey));}catch(nosuchalgorithmexceptione){e.printstacktrace();}catch(nosuchproviderexceptione){e.printstacktrace();}}/***明文加密*@paramplaintext*@return*/@sneakythrowspublicstaticstringencode(stringplaintext){system.out.println("明文字符串:" plaintext);stringciphertext=configtools.encrypt(privatekey,plaintext);system.out.println("加密后字符串:" ciphertext);returnciphertext;}/***解密*@paramciphertext*@return*/@sneakythrowspublicstaticstringdecode(stringciphertext){system.out.println("加密字符串:" ciphertext);stringplaintext=configtools.decrypt(publickey,ciphertext);system.out.println("解密后的字符串:" plaintext);returnplaintext;}
3、修改数据库的配置文件内容信息
a 、 修改密码
把密码替换成用druidencryptorutils这个工具类生成的密码
password:${datasource_pwd:hb5fmueai1u81yjrt/t6awimfg1/az5o8imy765wkvjououbc2h80jqmzrr8l9zwkuzs/8agzuq4yysakhywna==}
b、 filter开启config
filter:config:enabled:true
c、配置connectionproperties属性
connection-properties:config.decrypt=true;config.decrypt.key=${spring.datasource.publickey}
ps: spring.datasource.publickey为工具类生成的公钥
附录: 完整数据库配置
spring:datasource:type:com.alibaba.druid.pool.druiddatasourcedriverclassname:com.mysql.cj.jdbc.driverurl:${datasource_url:jdbc:mysql://localhost:3306/demo?useunicode=true&characterencoding=utf8&usessl=false&servertimezone=asia/shanghai}username:${datasource_username:root}password:${datasource_pwd:hb5fmueai1u81yjrt/t6awimfg1/az5o8imy765wkvjououbc2h80jqmzrr8l9zwkuzs/8agzuq4yysakhywna==}publickey:mfwwdqyjkozihvcnaqebbqadswawsajbaivp9xf4rcm4ofiu47nzy15iqnoab9k2ml9fitla05cwaxk7ufwbimr7xltzm1frl6ahwaxjb6a/fsjtjktzujecaweaaq==druid:#初始连接数initialsize:5#最小连接池数量minidle:10#最大连接池数量maxactive:20#配置获取连接等待超时的时间maxwait:60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timebetweenevictionrunsmillis:60000#配置一个连接在池中最小生存的时间,单位是毫秒minevictableidletimemillis:300000#配置一个连接在池中最大生存的时间,单位是毫秒maxevictableidletimemillis:900000#配置检测连接是否有效validationquery:select1fromdualtestwhileidle:truetestonborrow:falsetestonreturn:falsewebstatfilter:enabled:truestatviewservlet:enabled:true#设置白名单,不填则允许所有访问allow:url-pattern:/druid/*#控制台管理用户名和密码login-username:login-password:filter:stat:enabled:true#慢sql记录log-slow-sql:trueslow-sql-millis:1000merge-sql:truewall:config:multi-statement-allow:trueconfig:enabled:trueconnection-properties:config.decrypt=true;config.decrypt.key=${spring.datasource.publickey}
方案二:使用jasypt对数据库密码加密
1、pom.xml引入jasypt包
2、利用jasypt提供的工具类对明文密码进行加密
加密工具类如下
publicfinalclassjasyptencryptorutils{privatestaticfinalstringsalt="lybgeek";privatestaticbasictextencryptorbasictextencryptor=newbasictextencryptor();static{basictextencryptor.setpassword(salt);}privatejasyptencryptorutils(){}/***明文加密*@paramplaintext*@return*/publicstaticstringencode(stringplaintext){system.out.println("明文字符串:" plaintext);stringciphertext=basictextencryptor.encrypt(plaintext);system.out.println("加密后字符串:" ciphertext);returnciphertext;}/***解密*@paramciphertext*@return*/publicstaticstringdecode(stringciphertext){system.out.println("加密字符串:" ciphertext);ciphertext="enc(" ciphertext ")";if(propertyvalueencryptionutils.isencryptedvalue(ciphertext)){stringplaintext=propertyvalueencryptionutils.decrypt(ciphertext,basictextencryptor);system.out.println("解密后的字符串:" plaintext);returnplaintext;}system.out.println("解密失败");return"";}}
3、修改数据库的配置文件内容信息
a、 用enc包裹用jasyptencryptorutils 生成的加密串
password:${datasource_pwd:enc(p8m43qmzqn4c07dctpey4q==)}
b、 配置密钥和指定加解密算法
jasypt:encryptor:password:lybgeekalgorithm:pbewithmd5anddesiv-generator-classname:org.jasypt.iv.noivgenerator
因为我工具类使用的是加解密的工具类是basictextencryptor,其对应配置加解密就是pbewithmd5anddes和org.jasypt.iv.noivgenerator
ps: 在生产环境中,建议使用如下方式配置密钥,避免密钥泄露
java-jar-djasypt.encryptor.password=lybgeek
附录: 完整数据库配置
spring:datasource:type:com.alibaba.druid.pool.druiddatasourcedriverclassname:com.mysql.cj.jdbc.driverurl:${datasource_url:enc(kt/gwazwzafnep7ocbsgcqn7phrohatkjndgvglsw2ch67zqbveq7mn0btixaef4/fvv4l7mylfx0y6ap4umod7c2vwgyru5uqtkmdwzqn3hxvxktikrfpn9dm6 yahm0xp ppo9hawqa2ral0ejbcvmor3wscjnhcahi9khjyc=)}username:${datasource_username:enc(reqllqm5nphqnsupj3mljw==)}password:${datasource_pwd:enc(p8m43qmzqn4c07dctpey4q==)}druid:#初始连接数initialsize:5#最小连接池数量minidle:10#最大连接池数量maxactive:20#配置获取连接等待超时的时间maxwait:60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timebetweenevictionrunsmillis:60000#配置一个连接在池中最小生存的时间,单位是毫秒minevictableidletimemillis:300000#配置一个连接在池中最大生存的时间,单位是毫秒maxevictableidletimemillis:900000#配置检测连接是否有效validationquery:select1fromdualtestwhileidle:truetestonborrow:falsetestonreturn:falsewebstatfilter:enabled:truestatviewservlet:enabled:true#设置白名单,不填则允许所有访问allow:url-pattern:/druid/*#控制台管理用户名和密码login-username:login-password:filter:stat:enabled:true#慢sql记录log-slow-sql:trueslow-sql-millis:1000merge-sql:truewall:config:multi-statement-allow:truejasypt:encryptor:password:lybgeekalgorithm:pbewithmd5anddesiv-generator-classname:org.jasypt.iv.noivgenerator
方案三:自定义实现
实现原理: 利用spring后置处理器修改datasource
1、自定义加解密工具类
/***利用hutool封装的加解密工具,以aes对称加密算法为例*/publicfinalclassencryptorutils{privatestaticstringsecretkey;static{secretkey=hex.encodehexstring(secureutil.generatekey(symmetricalgorithm.aes.getvalue()).getencoded());system.out.println("secretkey-->" secretkey);system.out.println("--------------------------------------------------------------------------------------");}/***明文加密*@paramplaintext*@return*/@sneakythrowspublicstaticstringencode(stringplaintext){system.out.println("明文字符串:" plaintext);byte[]key=hex.decodehex(secretkey.tochararray());stringciphertext=secureutil.aes(key).encrypthex(plaintext);system.out.println("加密后字符串:" ciphertext);returnciphertext;}/***解密*@paramciphertext*@return*/@sneakythrowspublicstaticstringdecode(stringciphertext){system.out.println("加密字符串:" ciphertext);byte[]key=hex.decodehex(secretkey.tochararray());stringplaintext=secureutil.aes(key).decryptstr(ciphertext);system.out.println("解密后的字符串:" plaintext);returnplaintext;}/***明文加密*@paramplaintext*@return*/@sneakythrowspublicstaticstringencode(stringsecretkey,stringplaintext){system.out.println("明文字符串:" plaintext);byte[]key=hex.decodehex(secretkey.tochararray());stringciphertext=secureutil.aes(key).encrypthex(plaintext);system.out.println("加密后字符串:" ciphertext);returnciphertext;}/***解密*@paramciphertext*@return*/@sneakythrowspublicstaticstringdecode(stringsecretkey,stringciphertext){system.out.println("加密字符串:" ciphertext);byte[]key=hex.decodehex(secretkey.tochararray());stringplaintext=secureutil.aes(key).decryptstr(ciphertext);system.out.println("解密后的字符串:" plaintext);returnplaintext;}}
2、编写后置处理器
publicclassdruiddatasourceencyptbeanpostprocessorimplementsbeanpostprocessor{privatecustomencryptpropertiescustomencryptproperties;privatedatasourcepropertiesdatasourceproperties;publicdruiddatasourceencyptbeanpostprocessor(customencryptpropertiescustomencryptproperties,datasourcepropertiesdatasourceproperties){this.customencryptproperties=customencryptproperties;this.datasourceproperties=datasourceproperties;}@overridepublicobjectpostprocessbeforeinitialization(objectbean,stringbeanname)throwsbeansexception{if(beaninstanceofdruiddatasource){if(customencryptproperties.isenabled()){druiddatasourcedruiddatasource=(druiddatasource)bean;system.out.println("--------------------------------------------------------------------------------------");stringusername=datasourceproperties.getusername();druiddatasource.setusername(encryptorutils.decode(customencryptproperties.getsecretkey(),username));system.out.println("--------------------------------------------------------------------------------------");stringpassword=datasourceproperties.getpassword();druiddatasource.setpassword(encryptorutils.decode(customencryptproperties.getsecretkey(),password));system.out.println("--------------------------------------------------------------------------------------");stringurl=datasourceproperties.get;druiddatasource.set,url));system.out.println("--------------------------------------------------------------------------------------");}}returnbean;}}
3、修改数据库的配置文件内容信息
a 、 修改密码
把密码替换成用自定义加密工具类生成的加密密码
password:${datasource_pwd:fb31cdd78a5fa2c43f530b849f1135e7}
b 、 指定密钥和开启加密功能
custom:encrypt:enabled:truesecret-key:2f8ba810011e0973728afa3f28a0ecb6
ps: 同理secret-key最好也不要直接暴露在配置文件中,可以用-dcustom.encrypt.secret-key指定
附录: 完整数据库配置
spring:datasource:type:com.alibaba.druid.pool.druiddatasourcedriverclassname:com.mysql.cj.jdbc.driverurl:${datasource_url:dcb268cf3a2626381d2bc5c96f94fb3d7f99352e0e392362cb818a321b0ca61f3a8dad3aeb084242b745c61a1d3dc244ed1484bf745c858c44560dde10e60e90ac65f77ce2926676df7af6b35aefd2bb984ff9a868f1f9052ee9cae5572fa015b66a602f32df39fb1bbc36e04cc0f148e4d610a3e5d54f2eb7c57e4729c9d7b4}username:${datasource_username:61db3bf3c6d3fe3ce87549c1af1e9061}password:${datasource_pwd:fb31cdd78a5fa2c43f530b849f1135e7}druid:#初始连接数initialsize:5#最小连接池数量minidle:10#最大连接池数量maxactive:20#配置获取连接等待超时的时间maxwait:60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timebetweenevictionrunsmillis:60000#配置一个连接在池中最小生存的时间,单位是毫秒minevictableidletimemillis:300000#配置一个连接在池中最大生存的时间,单位是毫秒maxevictableidletimemillis:900000#配置检测连接是否有效validationquery:select1fromdualtestwhileidle:truetestonborrow:falsetestonreturn:falsewebstatfilter:enabled:truestatviewservlet:enabled:true#设置白名单,不填则允许所有访问allow:url-pattern:/druid/*#控制台管理用户名和密码login-username:login-password:filter:stat:enabled:true#慢sql记录log-slow-sql:trueslow-sql-millis:1000merge-sql:truewall:config:multi-statement-allow:truecustom:encrypt:enabled:truesecret-key:2f8ba810011e0973728afa3f28a0ecb6
关于“springboot项目数据库密码怎么实现加密”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“springboot项目数据库密码怎么实现加密”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道。