Spring Security 3.1 中功能強大的加密工具 PasswordEncoder

好吧,這種加密機制很複雜,仍是看下圖比較好了解: 算法

 3.1.0版本中新的PasswordEncoder繼承關係 

    

而在Spring-Security 3.1.0 版本以後,Spring-security-crypto模塊中的password包提供了更給力的加密密碼的支持,這個包中也有PasswordEncoder接口,接口定義以下。  spring

Java代碼   
  1. Public interface PasswordEncoder{  
  2.   String encode(String rawPassword);  
  3.   Boolean matches(String rawPassword,String encodedPassword);  
  4. }  

 定義了兩個方法,encode方法是對方法加密,而match方法是用來驗證密碼和加密後密碼是否一致的,若是一致則返回true。和authentication.encoding包中的PasswordEncoder接口相比,簡化了許多。  安全

   位於org.springframeword.security.crypto.password包中的  ide

StandardPasswordEncoder類,是PasswordEncoder接口的(惟一)一個實現類,是本文所述加密方法的核心。它採用SHA-256算法,迭代1024次,使用一個密鑰(site-wide secret)以及8位隨機鹽對原密碼進行加密。  測試

   隨機鹽確保相同的密碼使用屢次時,產生的哈希都不一樣; 密鑰應該與密碼區別開來存放,加密時使用一個密鑰便可;對hash算法迭代執行1024次加強了安全性,使暴力破解變得更困難些。  加密

   和上一個版本的PasswordEncoder比較,好處顯而易見:鹽值不用用戶提供,每次隨機生成;多重加密————迭代SHA算法+密鑰+隨機鹽來對密碼加密,大大增長密碼破解難度。  spa

OK,瞭解了原理咱們能夠來測試一下: code

Java代碼   
  1. import org.springframework.security.crypto.password.PasswordEncoder;  
  2. import org.springframework.security.crypto.password.StandardPasswordEncoder;  
  3.   
  4. /** 
  5.  * @author XUYI 
  6.  * Spring Security 3.1 PasswordEncoder 
  7.  */  
  8. public class EncryptUtil {  
  9.     //從配置文件中得到  
  10.     private static final String SITE_WIDE_SECRET = "my-secret-key";  
  11.     private static final PasswordEncoder encoder = new StandardPasswordEncoder(  
  12.        SITE_WIDE_SECRET);  
  13.    
  14.     public static String encrypt(String rawPassword) {  
  15.          return encoder.encode(rawPassword);  
  16.     }  
  17.    
  18.     public static boolean match(String rawPassword, String password) {  
  19.          return encoder.matches(rawPassword, password);  
  20.     }  
  21.       
  22.     public static void main(String[] args) {  
  23.         System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));  
  24.         System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));  
  25.         System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));  
  26.         System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));  
  27.         System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));    
  28.         //可是把每次結果拿出來進行match,你會發現能夠獲得true。  
  29.     }  
  30.  }  
相關文章
相關標籤/搜索