好吧,這種加密機制很複雜,仍是看下圖比較好了解: 算法
3.1.0版本中新的PasswordEncoder繼承關係
而在Spring-Security 3.1.0 版本以後,Spring-security-crypto模塊中的password包提供了更給力的加密密碼的支持,這個包中也有PasswordEncoder接口,接口定義以下。 spring
- Public interface PasswordEncoder{
- String encode(String rawPassword);
- Boolean matches(String rawPassword,String encodedPassword);
- }
定義了兩個方法,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
- import org.springframework.security.crypto.password.PasswordEncoder;
- import org.springframework.security.crypto.password.StandardPasswordEncoder;
-
- /**
- * @author XUYI
- * Spring Security 3.1 PasswordEncoder
- */
- public class EncryptUtil {
- //從配置文件中得到
- private static final String SITE_WIDE_SECRET = "my-secret-key";
- private static final PasswordEncoder encoder = new StandardPasswordEncoder(
- SITE_WIDE_SECRET);
-
- public static String encrypt(String rawPassword) {
- return encoder.encode(rawPassword);
- }
-
- public static boolean match(String rawPassword, String password) {
- return encoder.matches(rawPassword, password);
- }
-
- public static void main(String[] args) {
- System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));
- System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));
- System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));
- System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));
- System.out.println(EncryptUtil.encrypt("每次結果都不同伐?"));
- //可是把每次結果拿出來進行match,你會發現能夠獲得true。
- }
- }