2013-07-13 210 views
2

我已經在oracle數據庫中存儲了用戶名和加密密碼。如何在登錄時將用戶名與 加密密碼相匹配?如何在登錄時使用用戶名和加密密碼(java)

例如:username = abcd,加密密碼=#a11jsuy * & ^(實際密碼= abcd)。當用戶想要登錄時,他將使用username = abcd和password = abcd。但數據庫存儲加密密碼=#a11jsuy * & ^。如何將密碼與加密密碼和用戶名登錄進行匹配?

我正在使用java和JSF。任何建議請。提前致謝。

我使用下面的代碼:

FUNCTION get_hash (p_loginname IN VARCHAR2, 
        p_password IN VARCHAR2) 
RETURN VARCHAR2 AS 

l_salt VARCHAR2(30) := 'PutYourSaltHere'; 

    BEGIN 
    -- Pre Oracle 10g 
    RETURN DBMS_OBFUSCATION_TOOLKIT.MD5(
     input_string => p_loginname || l_salt || UPPER(p_password)); 

    END; 

回答

4

你並不需要搭配預加密密碼。您的數據庫存儲加密版本,以便您可以輸入用戶輸入的密碼,對其進行加密,然後查看它是否與數據庫中的值匹配。

+0

某些算法對同一文本給出了不同的結果,所以這種方法在這些情況下不會有用。加密密碼不是好習慣,它們必須散列。 –

+0

它工作@Steve。謝謝。 :-) – Novis

3

如果確實是加密,請從數據庫取得密碼,解密並將此解密密碼與用戶提供的密碼進行比較。

如果應該是,則散列,然後取用戶提供的密碼,對其進行散列,並將結果與​​存儲在數據庫中的散列密碼進行比較。

當然,用於解密/散列密碼的算法必須與在數據庫中存儲密碼時使用的算法相同。

+0

用戶名發生了什麼不清楚。你首先檢查密碼,然後檢查用戶名? –

+0

不可以。您可以應用相同的散列算法('get_hash()'),用戶嘗試登錄的登錄名和密碼與您用來在數據庫中存儲密碼的用戶登錄的密碼相同,除非存儲結果,但將其與存儲在數據庫中的散列密碼進行比較。如果密碼匹配,那就OK。如果沒有,密碼(或登錄)是錯誤的。如果您想要一個示例,請將用於存儲新用戶的Java代碼及其散列登錄名發佈到數據庫中,然後嘗試調整它以檢查密碼。 –

+0

我已經給出了我在下面使用的代碼。在註冊時,我將用戶名加密並存儲在數據庫中。我拿到密碼並將其散列並存儲在數據庫中。當用戶下次登錄時,我爲所有用戶運行for循環。每個用戶名都被解密,並在登錄時使用用戶輸入的用戶名進行檢查。如果解密的用戶名與輸入的用戶名匹配,我檢查散列的密碼。如果用戶數量預計很高,我會將前3個單詞存儲在一個單獨的字段中以過濾掉,以便循環不會佔用大量時間。 –

-1

我將未加密的用戶名的前三個字符作爲單獨的字段存儲在數據庫中。當用戶輸入憑證時,我將檢索與輸入的用戶名的前三個字符匹配的所有實體。我運行一個for循環,每個解密都在這裏完成。如果解密的匹配輸入的用戶名,我檢查密碼的散列。

我使用了像Jasypt這樣的專用庫。爲什麼重新發明輪子。

如果預期的最大用戶數量不是那麼大,我們可以避免存儲前幾個字母,並直接通過for循環的所有記錄。

這是安全控制器。

package com.divudi.bean; 

import java.io.Serializable; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import org.jasypt.util.password.BasicPasswordEncryptor; 
import org.jasypt.util.text.BasicTextEncryptor; 


@ManagedBean 
@SessionScoped 
public class SecurityController implements Serializable { 

    private static final long serialVersionUID = 1L; 


public SecurityController() { 
} 

public String encrypt(String word) { 
    BasicTextEncryptor en = new BasicTextEncryptor(); 
    en.setPassword("health"); 
    try { 
     return en.encrypt(word); 
    } catch (Exception ex) { 
     return null; 
    } 
} 

public String hash(String word) { 
    try { 
     BasicPasswordEncryptor en = new BasicPasswordEncryptor(); 
     return en.encryptPassword(word); 
    } catch (Exception e) { 
     return null; 
    } 
} 

public boolean matchPassword(String planePassword, String encryptedPassword) { 
    BasicPasswordEncryptor en = new BasicPasswordEncryptor(); 
    return en.checkPassword(planePassword, encryptedPassword); 
} 

public String decrypt(String word) { 
    BasicTextEncryptor en = new BasicTextEncryptor(); 
    en.setPassword("health"); 
    try { 
     return en.decrypt(word); 
    } catch (Exception ex) { 
     return null; 
    } 

    } 
} 

這是用戶輸入憑證時的方法。

private boolean checkUsers() { 
    String temSQL; 
    temSQL = "SELECT u FROM WebUser u WHERE u.retired = false"; 
    List<WebUser> allUsers = getFacede().findBySQL(temSQL); 
    for (WebUser u : allUsers) { 
     if (getSecurityController().decrypt(u.getName()).equalsIgnoreCase(userName)) { 
      if (getSecurityController().matchPassword(passord, u.getWebUserPassword())) { 
       setLoggedUser(u); 
       setLogged(Boolean.TRUE); 
       setActivated(u.isActivated()); 
       setRole(u.getRole()); 
       getMessageController().setDefLocale(u.getDefLocale()); 
       getMeController().createMenu(); 
       getWebUserBean().setLoggedUser(u); 
       UtilityController.addSuccessMessage("Logged successfully"); 
       return true; 
      } 
     } 
    } 
    return false; 
} 
+1

哈希!=加密。你有一個重大的安全問題。相關:http://diovo.com/2009/02/wrote-your-own-encryption-algorithm-duh/和http://security.stackexchange.com/questions/25585/is-my-developers-home-brew -password-security-right-or-wrong-and-why/ – BalusC

+0

我的意思是哈希和加密是完全不同的。當密鑰可用時,加密的單詞可以被解密。但散列字永遠不會再被解密。這是一種加密方式。我錯了嗎?我使用加密的用戶名和passwrods散列。 –

相關問題