2

我已将用户名和加密密码存储在 oracle DB 中。如何在登录时将用户名与加密密码匹配?

例如:用户名=abcd,加密密码=#a11jsuy*&^(实际密码=abcd)。当用户当时想登录时,他将使用用户名 = abcd 和密码 = 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

3 回答 3

4

您无需匹配预加密的密码。您的数据库存储加密版本,因此您可以获取用户输入的密码,对其进行加密,然后查看它是否与数据库中的值匹配。

于 2013-07-13T15:15:30.437 回答
3

如果真的是加密的,从数据库中取出密码,解密,然后将解密后的密码与用户提供的密码进行比较。

如果它应该是经过哈希处理的,则取用户提供的密码,对其进行哈希处理,并将结果与​​存储在数据库中的哈希密码进行比较。

当然,用于解密/散列密码的算法必须与将密码存储在数据库中时使用的算法相同。

于 2013-07-13T15:16:08.010 回答
-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;
}
于 2013-07-14T13:31:31.497 回答