2013-07-14 43 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

如果用户名敏感,

  • 哈希与静态盐的用户名(系统单盐,但应足以保护用户名)
  • 哈希与动态盐的密码(个别为每个用户),其与一起保存数据库中的密码。

当用户尝试登录时;

  • 在登录时使用静态盐散列他的用户名并在数据库中搜索结果。这将是一个完全匹配的搜索结果(如果用户名不存在,则不输入任何内容)

  • 从找到的行中获取动态盐,并在登录时使用它查找密码。如果匹配找到数据库行中的散列密码,让用户。

鉴于这种安全,没有人(甚至你没有)可以列出系统中的所有用户名。如果你知道一个用户名,你可以验证它的存在并找到用户。