2011-07-06 37 views
0

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

如果他已经在数据库中,我需要检查他的密码是否与db中记录的密码相匹配。对于新客户,我想要输入密码并为他创建一条记录。 我试图这样做的情况。

现有客户进入EMAILADDRESS和密码

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

现在,我该如何检查,如果此卡斯特对象与密码相关联,并匹配用户输入的内容? Manning的hibernate书籍示例将密码作为字符串存储在Customer类中。这是一个好主意吗?这将如何存储在数据库中?

当使用hibernate时,如何处理?我听到有人提到将密码存储为散列。但我不太清楚在我的应用程序中如何做到这一点。

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

回答

2

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

还有其他两种可能性

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

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

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

+0

感谢您的回复..使用哈希似乎是一个选项创建一个客户,我想我将不得不哈希用户的密码输入,调用customer.setPassword(hashedpass)然后调用客户端的saveUpdate(),以便将散列写入Customer表。为了验证,我将不得不散列用户输入,从数据库获得散列表,并匹配它们。这是正确的吗? – markjason72

+0

是的,就是这样。如果您确实需要安全存储,请在密码散列之前先密码。 –

0

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

String passwordEncrypted = encrypt(password); 

其中encrypt是你的函数,隐窝密码(你可以用MD5或SHA-1试,例如)。

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

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

散列(或消息摘要)不是加密。加密需要一个关键。加密的数据可以用这个密钥解密。哈希不能取消哈希。 –

+1

并且对密码进行哈希处理而不会使其受到字典攻击的影响。 –

+0

好回复!我确实使用了错误的术语。 – GAS

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

散列(或消息摘要)不是加密。加密需要一个关键。加密的数据可以用这个密钥解密。哈希不能取消哈希。 –

+1

并且对密码进行哈希处理而不会使其受到字典攻击的影响。 –

相关问题