2011-07-06 90 views
0

在我的web應用程序中使用servlet和hibernate。我需要驗證輸入密碼的客戶。與db中的記錄匹配的用戶密碼

如果他已經在數據庫中,我需要檢查他的密碼是否與db中記錄的密碼相匹配。對於新客戶,我想要輸入密碼併爲他創建一條記錄。 我試圖這樣做的情況。

現有客戶進入EMAILADDRESS和密碼

String email = req.getParameter("emailAddress"); 
String password = req.getParameter("password"); 
Customer cust = dao.findByEmailAddress(email); 

現在,我該如何檢查,如果此卡斯特對象與密碼相關聯,並匹配用戶輸入的內容? Manning的hibernate書籍示例將密碼作爲字符串存儲在Customer類中。這是一個好主意嗎?這將如何存儲在數據庫中?

當使用hibernate時,如何處理?我聽到有人提到將密碼存儲爲散列。但我不太清楚在我的應用程序中如何做到這一點。

有人能告訴我如何解決這個問題嗎?

回答

2

您必須決定如何存儲密碼。如果您將它們作爲字符串存儲在Hibernate實體中,則它們將以明文形式存儲在數據庫的varchar中。任何有權訪問數據庫的人都可以看到它們。在這種情況下進行身份驗證包括將發送的密碼與數據庫中的密碼進行比較。

還有其他兩種可能性

第一個由在將它們存儲在數據庫之前,他們用密鑰加密。但是這個密鑰必須存儲在某個地方,以便應用程序解密它們,並將解密後的密碼與用戶發送的密碼進行比較。但它至少可以將密碼的可見性僅限於對應用程序部署目錄具有訪問權限的人員。在這種情況下的認證包括用密鑰解密存儲在數據庫中的密碼,並將其與用戶發送的密碼進行比較。如果它們相同,則用戶發送正確的密碼。

最後一種可能性是使用單向散列算法(如SHA-1),也稱爲消息摘要算法。這樣就不需要祕密密鑰,任何人都可以訪問密碼(如果密碼被醃製),這將非常困難(閱讀:幾乎不可能)。此解決方案的缺點是,如果用戶丟失了密碼,則無法發送給他。唯一的可能性是將他重置爲新值,將此新密碼發送給用戶並要求他選擇一個新密碼。在這種情況下,對用戶進行認證包括對他發送的密碼進行散列並與存儲在數據庫中的散列進行比較。

閱讀http://en.wikipedia.org/wiki/Salt_(cryptography)更詳細的解釋。

+0

感謝您的回覆..使用哈希似乎是一個選項創建一個客戶,我想我將不得不哈希用戶的密碼輸入,調用customer.setPassword(hashedpass)然後調用客戶端的saveUpdate(),以便將散列寫入Customer表。爲了驗證,我將不得不散列用戶輸入,從數據庫獲得散列表,並匹配它們。這是正確的嗎? – markjason72

+0

是的,就是這樣。如果您確實需要安全存儲,請在密碼散列之前先密碼。 –

0

通常密碼被加密存儲在數據庫中,您必須加密輸入密碼以檢查它是否匹配。

String passwordEncrypted = encrypt(password); 

其中encrypt是你的函數,隱窩密碼(你可以用MD5或SHA-1試,例如)。

檢索完你的對象cust後,您可以檢查是否

if (cust.getPassword().equals(passwordEncrypted)) { 
    // login successfull code 
} else { 
    // login failed code 
} 
+1

散列(或消息摘要)不是加密。加密需要一個關鍵。加密的數據可以用這個密鑰解密。哈希不能取消哈希。 –

+1

並且對密碼進行哈希處理而不會使其受到字典攻擊的影響。 –

+0

好回覆!我確實使用了錯誤的術語。 – GAS

5

保存明文密碼是不是一個好主意。實際上,它在Top 25 Most Dangerous Software Errors中被列爲#8威脅。

在將密碼寫入數據庫之前,您需要加密密碼。在搜索用戶時使用加密密碼

String email = req.getParameter("emailAddress"); 
String password = req.getParameter("password"); 
String encryptedPassword = MD5Helper.hashPassword(password) 
Customer cust = dao.findByEmailAddressAndPassword(email, encryptedPassword); 

您可以使用類似的方式使用MD5算法加密密碼。

public class MD5Helper { 

    private static final int MD5_PASSWORD_LENGTH = 16; 

    public static String hashPassword(String password) { 
     String hashword = null; 
     try { 
      MessageDigest md5 = MessageDigest.getInstance("MD5"); 
      md5.update(password.getBytes()); 
      BigInteger hash = new BigInteger(1, md5.digest()); 
      hashword = hash.toString(MD5_PASSWORD_LENGTH); 
     } catch (NoSuchAlgorithmException nsae) { 
      // handle exception 
     } 
     return hashword; 
    } 
} 
+1

散列(或消息摘要)不是加密。加密需要一個關鍵。加密的數據可以用這個密鑰解密。哈希不能取消哈希。 –

+1

並且對密碼進行哈希處理而不會使其受到字典攻擊的影響。 –

相關問題