2013-07-14 75 views
0

我有一個JSF + JPA Web應用程序,其登錄機制如下。在JSF + JPA web應用程序中優化身份驗證

  1. 用戶名是加密
  2. 密碼進行散列
  3. 使用Jasypt
  4. 當用戶嘗試登錄,所有用戶都採取了一個循環。
  5. 解密每個用戶的用戶名並與輸入的用戶名匹配。
  6. 如果匹配,密碼將被散列,並使用存儲的hased密碼進行檢查。

在用戶數量預計很高的另一個應用程序中,我從前三個字母中過濾用戶,將其存儲爲單獨的字段。

如果您能指出我使用的次優方法並引導我採取正確行動,我將非常感謝。

的控制器關心的加密列

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; 
    } 

    } 
} 

這他怎麼檢查autnetication。

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; 
} 
+2

第一個問題,爲什麼要加密用戶名? –

+0

雖然可以讀取數據庫的攻擊者可能會攔截未加密的用戶名。 –

回答

2

如果用戶名敏感,

  • 哈希與靜態鹽的用戶名(系統單鹽,但應足以保護用戶名)
  • 哈希與動態鹽的密碼(個別爲每個用戶),其與一起保存數據庫中的密碼。

當用戶嘗試登錄時;

  • 在登錄時使用靜態鹽散列他的用戶名並在數據庫中搜索結果。這將是一個完全匹配的搜索結果(如果用戶名不存在,則不輸入任何內容)

  • 從找到的行中獲取動態鹽,並在登錄時使用它查找密碼。如果匹配找到數據庫行中的散列密碼,讓用戶。

鑑於這種安全,沒有人(甚至你沒有)可以列出系統中的所有用戶名。如果你知道一個用戶名,你可以驗證它的存在並找到用戶。