0
我有一個JSF + JPA Web應用程序,其登錄機制如下。在JSF + JPA web應用程序中優化身份驗證
- 用戶名是加密
- 密碼進行散列
- 使用Jasypt
- 當用戶嘗試登錄,所有用戶都採取了一個循環。
- 解密每個用戶的用戶名並與輸入的用戶名匹配。
- 如果匹配,密碼將被散列,並使用存儲的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;
}
第一個問題,爲什麼要加密用戶名? –
雖然可以讀取數據庫的攻擊者可能會攔截未加密的用戶名。 –