关于C#和Java平台的MD5

客户的Java平台,使用了spring框架自带的MD5方法来加密,我的是C#下面的MD5加密方法,我这边的加密方法只要穿字符串就行了,不要密钥,结果他那边Java平台里的MD5加密是有密钥的而且使用的是动态密钥,然后查了一下Spring的加密方式.

Acegi 对于密码提供三种方式:明文及不采用任何加密方式、MD5加密方式、哈希算法加密方式。

只需要在DAO的认证管理器中分别加入一下对应一下配置:


第一种:不使用任何加密方式的配置

Java代码
  1. <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">   
  2.     <property name="userDetailsService" ref="userDetailsService" />   
  3.   
  4.     <!-- 明文加密,不使用任何加密算法, 在不指定该配置的情况下,Acegi默认采用的就是明文加密 -->   
  5.     <!--   
  6.     <property name="passwordEncoder">   
  7.         <bean class="org.acegisecurity.providers.encoding.PlaintextPasswordEncoder">     
  8.                 <property name="ignorePasswordCase" value="true"></property>     
  9.         </bean>   
  10.     </property>   
  11.     -->   
  12. </bean>  

第二种:MD5方式加密

Java代码
  1. <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">   
  2.     <property name="userDetailsService" ref="userDetailsService" />   
  3.   
  4.     <property name="passwordEncoder">   
  5.         <bean class="org.acegisecurity.providers.encoding.Md5PasswordEncoder">   
  6.             <!-- false 表示:生成32位的Hex版, 这也是encodeHashAsBase64的, Acegi 默认配置; true  表示:生成24位的Base64版 -->   
  7.             <property name="encodeHashAsBase64" value="false" />   
  8.         </bean>   
  9.     </property>   
  10. </bean>  

第三种:使用MD5加密,并添加全局加密盐

Java代码
  1. <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">   
  2.     <property name="userDetailsService" ref="userDetailsService" />   
  3.   
  4.     <property name="passwordEncoder">   
  5.         <bean class="org.acegisecurity.providers.encoding.Md5PasswordEncoder">   
  6.             <property name="encodeHashAsBase64" value="false" />   
  7.         </bean>   
  8.     </property>   
  9.   
  10.     <!-- 对密码加密算法中使用特定的加密盐及种子 -->   
  11.     <property name="saltSource">   
  12.         <bean class="org.acegisecurity.providers.dao.salt.SystemWideSaltSource">   
  13.             <property name="systemWideSalt" value="acegisalt" />   
  14.         </bean>   
  15.     </property>   
  16. </bean>  

第四种:使用MD5加密,并添加动态加密盐
 
Java代码
  1. <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">   
  2.     <property name="userDetailsService" ref="userDetailsService" />   
  3.   
  4.     <property name="passwordEncoder">   
  5.         <bean class="org.acegisecurity.providers.encoding.Md5PasswordEncoder">   
  6.             <property name="encodeHashAsBase64" value="false" />   
  7.         </bean>   
  8.     </property>   
  9.   
  10.     <!-- 对密码加密算法中使用特定的加密盐及种子 -->   
  11.     <property name="saltSource">   
  12.         <!-- 通过动态的加密盐进行加密,该配置通过用户名提供加密盐, 通过UserDetails的getUsername()方式 -->   
  13.          <bean class="org.acegisecurity.providers.dao.salt.ReflectionSaltSource">   
  14.             <property name="userPropertyToUse" value="getUsername" />   
  15.          </bean>   
  16.     </property>   
  17. </bean>  

第五种:使用哈希算法加密,加密强度为256

Java代码
  1. <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">   
  2.     <property name="userDetailsService" ref="userDetailsService" />   
  3.   
  4.     <property name="passwordEncoder">   
  5.         <bean class="org.acegisecurity.providers.encoding.ShaPasswordEncoder">   
  6.             <constructor-arg value="256" />   
  7.             <property name="encodeHashAsBase64" value="false" />   
  8.         </bean>   
  9.     </property>   
  10. </bean>  
第六种:使用哈希算法加密,加密强度为SHA-256

Java代码
  1. <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">   
  2.     <property name="userDetailsService" ref="userDetailsService" />   
  3.   
  4.     <property name="passwordEncoder">   
  5.         <bean class="org.acegisecurity.providers.encoding.ShaPasswordEncoder">   
  6.             <constructor-arg value="SHA-256" />   
  7.             <property name="encodeHashAsBase64" value="false" />   
  8.         </bean>   
  9.     </property>   
  10. </bean>  
上述配置只是在Acegi通过表单提交的用户认证信息中的密码做各种加密操作。而我们存储用户密码的时候,可以通过一下程序完成用户密码操作:

Java代码
  1. package com.brofe.acegi;   
  2.   
  3. import org.acegisecurity.providers.encoding.Md5PasswordEncoder;   
  4. import org.acegisecurity.providers.encoding.ShaPasswordEncoder;   
  5.   
  6.   
  7. public class TestPasswordEncoder {   
  8.   
  9.     public static void main(String[] args) throws Exception {   
  10.            
  11.         md5(); // 使用简单的MD5加密方式   
  12.            
  13.         sha_256(); // 使用256的哈希算法(SHA)加密   
  14.            
  15.         sha_SHA_256(); // 使用SHA-256的哈希算法(SHA)加密   
  16.            
  17.         md5_SystemWideSaltSource(); // 使用MD5再加全局加密盐加密的方式加密    
  18.     }   
  19.   
  20.       
  21.     public static void md5() {   
  22.         Md5PasswordEncoder md5 = new Md5PasswordEncoder();   
  23.         // false 表示:生成32位的Hex版, 这也是encodeHashAsBase64的, Acegi 默认配置; true  表示:生成24位的Base64版   
  24.         md5.setEncodeHashAsBase64(false);   
  25.         String pwd = md5.encodePassword("123"null);   
  26.         System.out.println("MD5: " + pwd + " len=" + pwd.length());   
  27.     }   
  28.   
  29.       
  30.     public static void sha_256() {   
  31.         ShaPasswordEncoder sha = new ShaPasswordEncoder(256);   
  32.         sha.setEncodeHashAsBase64(false);   
  33.         String pwd = sha.encodePassword("123"null);   
  34.         System.out.println("哈希算法 256: " + pwd + " len=" + pwd.length());   
  35.     }   
  36.        
  37.       
  38.     public static void sha_SHA_256() {   
  39.         ShaPasswordEncoder sha = new ShaPasswordEncoder();   
  40.         sha.setEncodeHashAsBase64(false);   
  41.         String pwd = sha.encodePassword("123"null);    
  42.         System.out.println("哈希算法 SHA-256: " + pwd + " len=" + pwd.length());   
  43.     }   
  44.        
  45.       
  46.     public static void md5_SystemWideSaltSource () {   
  47.         Md5PasswordEncoder md5 = new Md5PasswordEncoder();   
  48.         md5.setEncodeHashAsBase64(false);   
  49.            
  50.         // 使用动态加密盐的只需要在注册用户的时候将第二个参数换成用户名即可   
  51.         String pwd = md5.encodePassword("123""acegisalt");   
  52.         System.out.println("MD5 SystemWideSaltSource: " + pwd + " len=" + pwd.length());   
  53.     }   
  54. }