2009-07-02 77 views
17

在數據訪問層中的Spring Hibernate(JPA)中,有什麼是應用密碼加密(希望使用註釋)的好方法,以及在哪裏可以找到更多關於完成它的知識(教程等) )?據瞭解,我將使用JCA支持的算法來加密密碼,但如果有簡單的方法,我寧願不必實現包裝邏輯。使用Spring/Hibernate進行密碼加密 - Jasypt或其他東西?

我在看Jasypt,並a)想知道如果這是一個很好的選擇,以及如何做到這一點,b)還有什麼人正在使用這個。如果有人使用Jasypt或其他替代方法,那麼您的體驗細節就會很棒。

+0

我一直保存在密碼的哈希而不是實際的密碼。這樣你仍然可以驗證它,但你沒有任何存儲它的責任。 – Jesse 2009-07-02 15:45:31

+1

沒錯,這正是我想要做的 - 只是試圖找到一個庫,它可以幫助查詢ORM層的散列值。 – stevedbrown 2009-07-02 15:46:50

回答

7

Java已經爲您提供了所有必需的庫。如OWASP所述,簡單地創建一個用鹽實現哈希的實用方法。

如果您確實不想擁有該代碼,並且不介意附加依賴關係,那麼Shiro庫(以前的JSecurity)具有OWASP描述的內容的implementation

它看起來像你提到的JASYPT庫有一個similar utility

我意識到這個答案沒有提到Spring或Hibernate,但我不清楚你希望在這種情況下如何使用它們。

0

我只是使用類似於SHA-256(username + ":" + password + ":" + salt)的東西,並將其存儲在數據庫中,名爲passwd的64個字符的列中。

維基百科說,與鹽有關:「鹽數據使使用字典條目預加密的字典攻擊變得複雜:所用鹽的每一位使所需存儲量和計算量翻倍......爲了獲得最佳安全性,鹽值保密,與密碼數據庫分開,這在數據庫被盜時提供了優勢,但鹽不是。「

所以要進行身份驗證,請使用提供的用戶名從數據庫獲取用戶,然後使用通過登錄嘗試提供的密碼生成相同的哈希,並與數據庫中的哈希進行比較。同時爲登錄嘗試添加一些速率限制(例如每5分鐘5次)。如果用戶忘記密碼,切勿向他們發送密碼(因爲您不會保存密碼),也不會通過電子郵件向他們發送新生成的密碼,而是通過電子郵件向他們發送鏈接,通過更改密碼密碼/隨機數/鹽分您可以檢查的URL。

+0

我編輯了我的問題 - 我不是在尋找算法,而是爲了在Spring/Hibernate堆棧中使用JCA算法的標準(即實現庫)方法。 – stevedbrown 2009-07-02 16:02:47

+1

所以你真的想在你的用戶帳戶模型中的某個字段上使用@Password("SHA-256")批註,並且你的框架可以在後臺自動處理驗證?在某些時候,你開始要求框架在功能方面過於具體,並且犧牲了靈活性。 – JeeBee 2009-07-02 21:03:47

2

MD5或SHA-256會很好,但現在MD5是可以破解的。

也許我誤解了這個問題,但它應該只是比較哈希密碼。

在hibernate中,只存儲爲一個字符串。在驗證方面,有如下方法:

public validate(String user, String pass) 
{ 
    if(getUser(user).getPass().equals(getHash(pass))) 
     return true; 
    return false; 
} 
5

您可以使用Jasypt with Hibernate來即時加密或散列您的屬性,如果這就是你要找的。如果你想自己推出,使用JCE的計算摘要(散列)的實際算法非常簡單。

2

似乎沒有要與Jasypt做一個Hibernate的具體方式,但你可以設置在春季密碼加密:

<!-- 
    Set up string digester here so we can configure it for more pools if it's a problem... 
    --> 
    <bean id="stringDigester" class="org.jasypt.digest.PooledStringDigester"> 
    <!-- same settings as StrongPasswordGenerator --> 
    <property name="poolSize" value="2"/> 
    <property name="algorithm" value="SHA-256"/> 
    <property name="iterations" value="100000"/> 
    <property name="saltGenerator"> 
     <bean class="org.jasypt.salt.RandomSaltGenerator"/> 
    </property> 
    <property name="saltSizeBytes" value="16"/> 
    </bean> 

    <!-- ...and then we only have to deal with the passwordEncryptor interface in code. --> 
    <bean id="passwordEncryptor" class="com.myproject.util.StringPasswordEncryptor"> 
    <property name="stringDigester" ref="stringDigester"/> 
    </bean> 

之後,你叫context.getBean(「passwordEncryptor 「)獲取加密器,然後調用encryptPassword()或checkPassword()。