匹配db中记录的用户密码

时间:2011-07-06 08:52:16

标签: java hibernate passwords hash

在我使用servlet和hibernate的web应用程序中。我需要验证输入密码的客户。

如果他已经在数据库中,我需要检查他的密码是否与db中的记录匹配。对于新客户,我想获取密码并为他创建记录。 我尝试以这种方式为场景做到这一点。

现有客户输入电子邮件地址和密码

String email = req.getParameter("emailAddress");
String password = req.getParameter("password");
Customer cust = dao.findByEmailAddress(email);

现在,我如何检查此cust对象是否与密码相关联并且与用户输入的内容相匹配? Manning的hibernate book示例将密码存储为Customer类中的String。这是一个好主意吗?如何将其存储在数据库中?

使用hibernate时,如何处理?我听说有人提到将密码存储为哈希。但我不太确定如何在我的应用程序中执行此操作。

有人可以告诉我如何解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

存储纯文本密码绝不是一个好主意。事实上,它在Top 25 Most Dangerous Software Errors中被列为#8威胁。

您需要在将密码写入数据库之前加密密码。搜索用户时使用加密密码

String email = req.getParameter("emailAddress");
String password = req.getParameter("password");
String encryptedPassword = MD5Helper.hashPassword(password)
Customer cust = dao.findByEmailAddressAndPassword(email, encryptedPassword);

您可以使用类似的方法使用MD5算法加密密码。

public class MD5Helper {

    private static final int MD5_PASSWORD_LENGTH = 16;

    public static String hashPassword(String password) {
        String hashword = null;
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(password.getBytes());
            BigInteger hash = new BigInteger(1, md5.digest());
            hashword = hash.toString(MD5_PASSWORD_LENGTH);
        } catch (NoSuchAlgorithmException nsae) {
            // handle exception
        }
        return hashword;
    }
}

答案 1 :(得分:2)

您必须决定如何存储密码。如果将它们作为String存储在Hibernate实体中,它们将以明文形式存储在数据库的varchar中。因此,任何有权访问数据库的人都可以看到它们。在这种情况下进行身份验证包括将发送的密码与数据库中的密码进行比较。

还有两种可能性

第一个包括在将密钥存储在数据库中之前用密钥加密它们。但是这个密钥必须存储在某个地方,以便您的应用程序解密它们并将解密的密码与用户发送的密码进行比较。但它至少可以降低密码的可见性,仅限于访问应用程序部署目录的人员。在这种情况下进行身份验证包括使用密钥解密存储在数据库中的密码,并将其与用户发送的密码进行比较。如果它们相等,则用户发送了正确的密码。

最后一种可能性是使用单向散列算法(例如SHA-1),也称为消息摘要算法。这样,就不需要秘密密钥了,任何人都可以访问密码(如果密码被腌制)会非常困难(阅读:几乎不可能)。此解决方案的缺点是,如果用户丢失了密码,您将无法发送给他。唯一的可能性是将他重置为新值,将此新密码发送给用户并要求他选择一个新密码。在这种情况下,对用户进行身份验证包括散列他发送的密码并与存储在数据库中的哈希进行比较。

阅读http://en.wikipedia.org/wiki/Salt_(cryptography)以获取更详细的解释。

答案 2 :(得分:0)

通常,密码以加密方式存储在数据库中,您必须加密输入密码以检查它是否匹配。

String passwordEncrypted = encrypt(password);

其中encrypt是加密密码的函数(例如,您可以尝试使用MD5或SHA-1)。

检索完对象cust后,您可以检查是否

if (cust.getPassword().equals(passwordEncrypted)) {
    // login successfull code
} else {
    // login failed code
}