1. 程式人生 > >SpringSecurity學習筆記(四)——更改SpringSecurity加密方式

SpringSecurity學習筆記(四)——更改SpringSecurity加密方式

在前面幾篇部落格中我們瞭解瞭如何自定義介面以及如何訪問資料庫中的使用者並驗證許可權等,那麼在驗證使用者以及密碼是否正確時,SpringSecurity是如何做的呢?如果想更改SpringSecurity的加密方式又該怎麼做呢?

SpringSecurity驗證密碼正確主要是MessageDigestPasswordEncoder這個類在做,其中isPasswordValid方法便是驗證密碼是否正確,與傳統的加密方式不同,SpringSecurity中加入了salt(鹽),能夠使破解的風險大大降低。

更改SpringSecurity加密方式有多種,我這邊大致介紹兩種比較常用的

注:案例均以簡單的MD5加密為例(與原來的區別在於不加鹽)


方法一:繼承MessageDigestPasswordEncoder

老的PasswordEncoder與其關係圖如下


spring-security.xml

<authentication-manager alias="authenticationManager">
		<authentication-provider user-service-ref="myUserDetailsService">
			<password-encoder  ref="myMessageDigestPasswordEncoder">  
	            <salt-source user-property="username"/>  
	        </password-encoder> 
        </authentication-provider>
	</authentication-manager>
	<beans:bean class="com.springsecurity.service.MyMessageDigestPasswordEncoder" id="myMessageDigestPasswordEncoder">
		<beans:constructor-arg value="md5"></beans:constructor-arg>
	</beans:bean>

MyMessageDigestPasswordEncoder.java

package com.springsecurity.service;

import org.apache.log4j.Logger;
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;
import com.springsecurity.utils.MD5;

/**
 * @作者:JackHisen(GWD)
 * @專案名:core
 * @時間:2017-7-2 下午8:24:41
 * @version 1.0
 */
public class MyMessageDigestPasswordEncoder extends MessageDigestPasswordEncoder{
	Logger logger=Logger.getLogger(MyMessageDigestPasswordEncoder.class);
	public MyMessageDigestPasswordEncoder(String algorithm,
			boolean encodeHashAsBase64) throws IllegalArgumentException {
		super(algorithm, encodeHashAsBase64);
		// TODO Auto-generated constructor stub
	}
	public MyMessageDigestPasswordEncoder(String algorithm) {
		super(algorithm);
		// TODO Auto-generated constructor stub
	}
	public boolean isPasswordValid(String encPass, String rawPass,Object salt){
		String pass1 = "" + encPass;
		String pass2 = MD5.getMd5(rawPass);//這個類是自己編寫的一個MD5加密,官方原本是通過encodePassword加鹽加密
		logger.debug("encPass:"+encPass+";rawPass:"+rawPass+"pass1:"+pass1+";pass2:"+pass2);
		boolean bool=false;
		if(pass1.equals(pass2)){
			bool=true;
		}
		return bool;
	}


方法二.實現新的PasswordEncoder介面

PasswordEncoder介面實現類如下:


NoOpPasswordEncoder不多說了,啥也不做按原文字處理,相當於不加密。

StandardPasswordEncoder 1024次迭代的SHA-256雜湊雜湊加密實現,並使用一個隨機8位元組的salt。

BCryptPasswordEncoder 使用BCrypt的強雜湊雜湊加密實現,並可以由客戶端指定加密的強度strength,強度越高安全性自然就越高,預設為10.

Spring的註釋中,明確寫明瞭如果是開發一個新的專案,BCryptPasswordEncoder是較好的選擇。