`

Spring Acegi 各种加密方式详解(转)

阅读更多

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.     }   

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics