2012-07-07 159 views
2

我敢肯定,這已被問過,但我找不到任何答案這個問題。春季安全與休眠,存儲加密密碼

使用Spring-security,我使用的是密碼編碼器。

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


    <authentication-manager> 
     <authentication-provider user-service-ref='CustomUserDetailsService'> 
     <password-encoder ref="passwordEncoder"/> 
     </authentication-provider> 
    </authentication-manager> 

在我的一個UserDAOImpl我已經添加用戶時,下面的代碼...

@Override 
public void addUser(final User user) { 
    user.setPassword(passwordEncoder.encodePassword(user.getPassword(), "salt")); 
    sessionFactory.getCurrentSession().save(user); 
} 

我的密碼被正確編碼,但總是被解讀爲無效,這有點有意義的,因爲我不不知道Spring會如何知道我的鹽是「鹽」 - 你如何告訴春季安全以及Hibernate使用相同的鹽?我是否缺少有關spring security如何管理密碼的內容?

回答

4

推薦的方法是使用標準密碼編碼器,該編碼器將使用隨機鹽,並將該鹽與消化的密碼進行存儲。這樣,你不需要提供任何鹽。如果您想提供自己的鹽,那麼您需要將SaltSource注入到DAO身份驗證器中,如the documentation(並且當您編碼密碼以創建新用戶時使用相同的源代碼):

crypto軟件包中的StandardPasswordEncoder使用一個隨機的8字節的 salt,它存儲在與密碼相同的字段中。

遺留的方法來處理鹽是注入一個SaltSource到 DaoAuthenticationProvider的時候,這將獲得用於 特定用戶的鹽值,並且將它傳遞給的PasswordEncoder。隨機使用 鹽,並將其與密碼數據字段組合使用,意味着您不必擔心鹽處理的細節(例如存儲值的位置),因爲它全部在內部完成。因此,我們強烈建議您使用此方法 ,除非您已在 位置分別存儲鹽的系統。

對於您的情況,SaltSource將始終返回「鹽」。請注意,這種醃製方式是不安全的,因爲所有共享一個共同密碼的用戶(是的,它發生)最終都會有相同的哈希密碼。這意味着攻擊者查找一個用戶的密碼也會找到所有共享相同密碼的用戶的密碼。

+1

這些天推薦的選項是使用[BCrypt](http://stackoverflow.com/a/8528804/241990)。只需在你的Hibernate DAO中注入一個'BCryptPasswordEncoder'(或者在內部實例化一個),使用它來創建哈希並使用相同的bean進行驗證。鹽將自動處理。 – 2012-07-07 17:09:18

+0

@LukeTaylor:謝謝你提供的信息。 TODO:建議在文檔中:-) – 2012-07-07 17:21:06