我已经在oracle DB中存储了用户名和加密密码。如何在登录时将用户名与加密密码进行匹配?
例如:用户名= abcd,加密密码= #a11jsuy*&^ (实际密码= abcd)。当用户想要登录时,他将使用用户名= abcd和密码= abcd。但是DB存储加密的password = #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;发布于 2013-07-13 23:15:30
您不需要匹配预加密的密码。您的数据库存储加密版本,因此您可以获取用户输入的密码,对其进行加密,然后查看它是否与数据库中的值匹配。
发布于 2013-07-13 23:16:08
如果它确实是加密的,那么从数据库中获取密码,对其进行解密,并将解密后的密码与用户提供的密码进行比较。
如果它实际上是散列的,那么获取用户提供的密码,对其进行散列,并将结果与数据库中存储的散列密码进行比较。
当然,用于解密/散列密码的算法必须与在数据库中存储密码时使用的算法相同。
发布于 2013-07-14 21:31:31
我将未加密的用户名的前三个字符作为单独的字段存储在数据库中。当用户输入凭据时,我检索与输入的用户名的前三个字符匹配的所有实体。我运行了一个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;
}https://stackoverflow.com/questions/17631449
复制相似问题