2012-12-07 84 views
5

我正在使用一個遺留的基於Spring MVC的Web應用程序,它使用了 - 按照當前標準 - 不適當的哈希算法。現在我想逐漸將所有哈希移植到bcrypt。我的高層次戰略是:如何在使用彈簧安全性時更改密碼散列算法?

  • 新的哈希值默認
  • 與bcrypt生成當用戶成功登錄,並仍具有傳統的哈希值,應用程序替換舊的哈希值與新的散列bcrypt。

用Spring Security實現這個策略的最習慣的方式是什麼?我應該使用自定義過濾器還是使用AccessDecisionManager或...?

回答

5

你可能有自定義您的AuthenticationProvider,因爲這是該密碼實際上與用戶數據進行比較,並且您擁有所有需要的信息。

authenticate方法中,您將首先加載用戶數據。然後用BCryptPasswordEncoder和您的舊版密碼檢查用戶提供的密碼。如果兩個都不返回匹配,則拋出BadCredentialsException

如果用戶認證成功(非常重要:-))並且密碼是傳統格式(傳統編碼器匹配),那麼您可以調用一些額外的代碼來更新用戶的帳戶數據並用bcrypt替換舊式散列一。 BCryptPasswordEncoder也可以用來創建新的哈希值。

如果需要,可以在進行比較之前事先檢測存儲的哈希是否已經被加密。 Bcrypt字符串有相當不同的格式。

還要注意,爲了讓猜測有效的帳戶名更難,您應該嘗試使方法在所提供的用戶名存在以及不存在時(按照所需時間)表現相同。因此,即使您沒有提供用戶名的用戶數據,也請致電編碼器。

0

我認爲要做到這一點最好的辦法是指定的密碼編碼器的身份驗證提供一些東西像下面,更多信息,請參閱doc

<authentication-manager> 
    <authentication-provider user-service-ref="userService"> 
     <password-encoder ref="passwordEncoder"> 
      <salt-source ref="saltSource" /> 
     </password-encoder> 
    </authentication-provider> 
</authentication-manager> 


<beans:bean  class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" 
    id="passwordEncoder" /> 

<beans:bean  class="org.springframework.security.authentication.dao.ReflectionSaltSource" 
    id="saltSource"> 
    <beans:property name="userPropertyToUse" value="userName" /> 
</beans:bean> 
+0

這並沒有回答這個問題。它要求如何將使用傳統散列格式的現有應用程序遷移到使用bcrypt的應用程序。 –