如何在Web应用程序中管理密码?

时间:2011-03-16 03:25:54

标签: java mysql passwords password-protection

在Web应用程序中保留用户密码的最新技术方法是什么?我正在使用Java 6 + MySQL。我想到的一些问题是:在应用程序中编程还是通过DBMS进行编码更好(这是否相关)?哪种算法被认为是可靠的?什么存储在数据库中?这个东西真的很新,所以可能错过了一些关键细节,在这种情况下请不要犹豫,让我知道。

谢谢。

3 个答案:

答案 0 :(得分:3)

您应该将安全哈希 salted 版本的密码存储到数据库中。因此,如果您的网站遭到入侵,由于用户几乎在任何地方都使用相同的通行证,因此其他帐户不会受到损害。

为此,应完成以下操作:

  1. 使用尚未中断的安全散列算法(最好是SHA-512, Sha1和MD5已损坏
  2. 连接用户名+密码+盐(盐应该是一个相对较长的常量字符串,在您的应用程序中是相同的,并且可以防止彩虹攻击付出一些努力)
  3. SHA-512连接结果并将其存储在数据库中。
  4. 每次用户尝试登录时,使用相同的方法散列他/她的凭据并检查数据库中的数据,如果相同,则正确。
  5. 散列密码(App或DB)并不重要,但DB的安全散列功能有限,因此app是更好的选择。

答案 1 :(得分:3)

bcrypt是一种可靠的密码哈希算法。它是由安全专业人员在考虑安全性的情况下创建的。

bcrypt很慢(这是一件好事,使彩虹表创建成本非常高)。您可以使用可变数量的轮次配置bcrypt以使用您正在使用的任何硬件进行缩放(更多轮次=更慢)。此外,它自动处理盐生成,每个哈希不同的盐(这使得彩虹表攻击几乎不可能,因为bcrypt的缓慢性质以及每个密码需要一个完整的彩虹表的事实。

jBCrypt提供了bcrypt的Java实现。

答案 2 :(得分:0)

你要面对很多自称为安全大师的愤怒,因为他们会问这样的问题。我自己,不是安全专家,但觉得自己有资格提出一些由常识驱动的建议。根据您希望应用程序的安全程度,有各种方法。

1-大多数攻击发生在您通过网络传输凭据时。 (男人在中间的东西)。因此,您需要确保用户名和密码的传输应该是安全的。 (ssl或HTTP摘要)。如果安全性非常重要,那么您应该探索是否需要传递用户名\密码。 (通过使用一些基于令牌的身份验证,如Oauth而不是用户名和密码)

2-如果您决定传入用户名和密码,则需要在应用程序范围内减少密码字符串的生命周期。当然,最好的方法是基于像LDAP这样的机制实现身份验证过滤器。大多数LDAP存储,允许您存储加密密码,并允许您通过绑定执行身份验证。(因此您的应用程序永远不会担心abt身份验证和存储)

3-如果您确实将密码带到了应用程序层,当然您仍需要缩短明文密码的生命周期并使用某种安全散列算法进行加密。但是这种方法并将密码存储在您的数据库中(即使是加密形式)也不是那么安全。 (特别是,因为您正在存储密码,所以有人可以绕过您的安全层)

总而言之,根据您需要的安全数量,您需要问自己以下问题。

1-您是否需要发送用户名/密码?

2-您能否确保无法通过网络嗅探密码?

3-您是否可以将身份验证委派给前端过滤器,而不是将其引入应用程序层?