热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springweb项目数据库用户名密码加密解密

springweb项目数据库用户名密码加密解密,Go语言社区,Golang程序员人脉社


spring web项目 数据库用户名密码加密解密


在使用springMVC开发web项目中,数据库的用户名,密码一般都是配置在.properties文件中

然后在通过.xml配置文件引入.properties的变量,例如

在config.properties文件中,配置如下变量,变量值配置在pom.xml的profile标签下,在此就不再赘述





[html] view
plain copy 在CODE上查看代码片派生到我的代码片



  1. jdbc.driverClassName=com.mysql.jdbc.Driver  

  2. jdbc.url=jdbc:mysql://${p.jdbc.url}/${p.jdbc.dbname}?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true  

  3. jdbc.username=${p.jdbc.username}  

  4. jdbc.password=${p.jdbc.password}  



在applicationContext.xml中,通过如下标签引入这些变量值









    1. <context:property-placeholder location="classpath:/config.properties" /> 




这样对于是明文的帐号,密码,是没有问题的。但是如果我在配置文件中的帐号密码是加密后的,那么如何进行使用配置呢?


解决办法:

1.首先确定加密解密算法,这种情况下,我们肯定选择是对称性加密解密算法,首选DES算法,在这里就拿他举例

2.完成加密解密算法,这个代码很简单,就不赘述,密钥自己决定,保密即可





[java] view
plain copy 在CODE上查看代码片派生到我的代码片



  1. public class DESUtils  

  2. {  

  3.     private static Key key;  

  4.     private static String KEY_STR="mykey";  

  5.       

  6.     static{  

  7.         try  

  8.         {  

  9.             KeyGenerator generator = KeyGenerator.getInstance("DES");  

  10.             SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG");  

  11.             secureRandom.setSeed(KEY_STR.getBytes());  

  12.             generator.init(secureRandom);  

  13.             key = generator.generateKey();  

  14.             generator=null;  

  15.         }  

  16.         catch (Exception e)  

  17.         {  

  18.             throw new RuntimeException(e);  

  19.         }  

  20.     }  

  21.       

  22.     /** 

  23.      * 对字符串进行加密,返回BASE64的加密字符串 

  24.      * <功能详细描述> 

  25.      * @param str 

  26.      * @return 

  27.      * @see [类、类#方法、类#成员] 

  28.      */  

  29.     public static String getEncryptString(String str){  

  30.         BASE64Encoder base64Encoder = new BASE64Encoder();  

  31.         System.out.println(key);  

  32.         try  

  33.         {  

  34.             byte[] strBytes = str.getBytes("UTF-8");  

  35.             Cipher cipher = Cipher.getInstance("DES");  

  36.             cipher.init(Cipher.ENCRYPT_MODE, key);  

  37.             byte[] encryptStrBytes = cipher.doFinal(strBytes);  

  38.             return base64Encoder.encode(encryptStrBytes);  

  39.         }  

  40.         catch (Exception e)  

  41.         {  

  42.             throw new RuntimeException(e);  

  43.         }  

  44.           

  45.     }  

  46.       

  47.     /** 

  48.      * 对BASE64加密字符串进行解密 

  49.      * <功能详细描述> 

  50.      * @param str 

  51.      * @return 

  52.      * @see [类、类#方法、类#成员] 

  53.      */  

  54.     public static String getDecryptString(String str){  

  55.         BASE64Decoder base64Decoder = new BASE64Decoder();  

  56.         try  

  57.         {  

  58.             byte[] strBytes = base64Decoder.decodeBuffer(str);  

  59.             Cipher cipher = Cipher.getInstance("DES");  

  60.             cipher.init(Cipher.DECRYPT_MODE, key);  

  61.             byte[] encryptStrBytes = cipher.doFinal(strBytes);  

  62.             return new String(encryptStrBytes,"UTF-8");  

  63.         }  

  64.         catch (Exception e)  

  65.         {  

  66.             throw new RuntimeException(e);  

  67.         }  

  68.           

  69.     }  

  70.       

  71.       

  72.     public static void main(String[] args)  

  73.     {  

  74.         String name ="root";  

  75.         String password="1234";  

  76.         String encryname = getEncryptString(name);  

  77.         String encrypassword = getEncryptString(password);  

  78.         System.out.println(encryname);  

  79.         System.out.println(encrypassword);  

  80.           

  81.         System.out.println(getDecryptString(encryname));  

  82.         System.out.println(getDecryptString(encrypassword));  

  83.     }  

  84. }  



3.springMVC中需要实现解密的接口

需要覆盖convertProperty方法,encryptPropNames存储的是需要解密的属性





[java] view
plain copy 在CODE上查看代码片派生到我的代码片



  1. public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer  

  2. {  

  3.     private String[] encryptPropNames = {"jdbc.username""jdbc.password"};  

  4.       

  5.     @Override  

  6.     protected String convertProperty(String propertyName, String propertyValue)  

  7.     {  

  8.           

  9.         //如果在加密属性名单中发现该属性  

  10.         if (isEncryptProp(propertyName))  

  11.         {  

  12.             String decryptValue = DESUtils.getDecryptString(propertyValue);  

  13.             System.out.println(decryptValue);  

  14.             return decryptValue;  

  15.         }else {  

  16.             return propertyValue;  

  17.         }  

  18.           

  19.     }  

  20.       

  21.     private boolean isEncryptProp(String propertyName)  

  22.     {  

  23.         for (String encryptName : encryptPropNames)  

  24.         {  

  25.             if (encryptName.equals(propertyName))  

  26.             {  

  27.                 return true;  

  28.             }  

  29.         }  

  30.         return false;  

  31.     }  

  32. }  



4.配置这个解密类



[html] view
plain copy 在CODE上查看代码片派生到我的代码片



  1. 用  

  2. <bean class="com.cyou.web.common.EncryptPropertyPlaceholderConfigurer" p:location="classpath:/config.properties">bean>  

  3. 代替  

  4. <context:property-placeholder location="classpath:/config.properties" /> 





推荐阅读
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
author-avatar
ian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有