2009-08-07 58 views
0

對於內部Tomcat/Java/Struts應用程序,我們將自定義編寫的認證代碼轉換爲使用JDBCRealm。數據庫是MySQL 5.0,密碼存儲爲PASSWORD()-加密的字符串。在我們的MySQL版本中,PASSWORD() function是一個非標準(私有?)41字節散列。 (我現在知道,我們不應該使用它自己的密碼,而應使用SHA1()MD5(),但我們在這裏。)針對MySQL的JDBCRealm摘要PASSWORD()函數

有沒有辦法使用JDBMRealm不強制所有用戶重新輸入他們的密碼,我們可以重新編碼它們?是否有一個JDBCRealm摘要可以讓我們對PASSWORD()編碼的密碼列進行身份驗證?

回答

1

新的MySQL版本provide a function調用OLD_PASSWORD()消化密碼的方式向後兼容4.0和以前版本。

你可以做什麼,因此,是configure JDBCRealm以這樣的方式,即:

  1. 不使用任何一種自身消化。即使在安全的環境中,這顯然並不理想,如果您的數據庫服務器存在於不可信的連接中,則會非常危險。您通過不指定digest屬性來執行此操作。
  2. 使用上述OLD_PASSWORD()函數對密碼進行加密,然後將其與數據庫中的密碼進行比較。你將不得不擴展JDBCRealm,這個功能並不是開箱即用的。對於Tomcat 6.0,您必須重寫authenticate(Connection c, String username, String credentials)方法。

您也可以用上面的方法,因爲遷移戰略的一部分:有重寫的方法既支持OLD_PASSWORD()和消化力誰已經使用OLD_PASSWORD()更改其密碼身份驗證的用戶。隨着時間的推移,你希望能夠切換到基於標準摘要的方法。

+0

我已將此標記爲其他人的解決方案,但我們已決定做正確的事情並將所有密碼修復爲MD5編碼,即使它會惹惱我們的用戶。 – Plutor 2009-08-11 19:40:55

+0

我只能羨慕你 - 我無法惹惱我的用戶:-) – ChssPly76 2009-08-11 19:43:47