Java 如何在web应用程序中管理密码?
在web应用程序中保存用户密码的最新方法是什么?我正在使用Java6+MySQL。我想问的一些问题是:在应用程序中编码还是通过DBMS编码更好(这是否相关)?哪种算法被认为是可靠的?在数据库中存储什么?真的是新的东西,所以可能会错过一些关键的细节,在这种情况下,请不要犹豫让我知道Java 如何在web应用程序中管理密码?,java,mysql,passwords,password-protection,Java,Mysql,Passwords,Password Protection,在web应用程序中保存用户密码的最新方法是什么?我正在使用Java6+MySQL。我想问的一些问题是:在应用程序中编码还是通过DBMS编码更好(这是否相关)?哪种算法被认为是可靠的?在数据库中存储什么?真的是新的东西,所以可能会错过一些关键的细节,在这种情况下,请不要犹豫让我知道 谢谢。您应该将安全地散列和盐渍版本的密码存储到数据库中。因此,如果你的网站遭到黑客攻击,因为用户几乎在任何地方都使用相同的通行证,因此他们的其他帐户不会受到危害 为此,应执行以下操作: 使用尚未损坏的安全哈希算法(最好
谢谢。您应该将安全地散列和盐渍版本的密码存储到数据库中。因此,如果你的网站遭到黑客攻击,因为用户几乎在任何地方都使用相同的通行证,因此他们的其他帐户不会受到危害 为此,应执行以下操作:
在何处散列密码(应用程序或数据库)并不重要,但数据库的安全散列功能有限,因此应用程序是更好的选择。您应该将安全散列的和盐渍的版本的密码存储到数据库中。因此,如果你的网站遭到黑客攻击,因为用户几乎在任何地方都使用相同的通行证,因此他们的其他帐户不会受到危害 为此,应执行以下操作:
在何处散列密码(应用或数据库)并不重要,但数据库的安全散列功能有限,因此应用是更好的选择。
bcrypt
是一种可靠的密码散列算法。它是由安全专业人员出于安全考虑而创建的
bcrypt
速度很慢(这是一件好事,这使得创建rainbow表的成本非常高)。您可以配置具有可变轮数的bcrypt
,以适应您使用的任何硬件(轮数越多=速度越慢)。此外,它还会自动处理salt生成,即每个哈希生成不同的salt(这使得彩虹表攻击几乎不可能,因为bcrypt
的速度很慢,而且每个密码需要一个完整的彩虹表)
bcrypt
的Java实现可在上获得。bcrypt
是一种可靠的密码哈希算法。它是由安全专业人员出于安全考虑而创建的
bcrypt
速度很慢(这是一件好事,这使得创建rainbow表的成本非常高)。您可以配置具有可变轮数的bcrypt
,以适应您使用的任何硬件(轮数越多=速度越慢)。此外,它还会自动处理salt生成,即每个哈希生成不同的salt(这使得彩虹表攻击几乎不可能,因为bcrypt
的速度很慢,而且每个密码需要一个完整的彩虹表)
bcrypt
的Java实现可以在上找到。你将因为提出这样的问题而面对许多自称安全大师的愤怒。我自己,不是一个安全专家,但觉得自己有资格提出一些建议,由常识驱动。根据您希望应用程序的安全程度,有多种方法
1-大多数攻击发生在您通过网络传输凭据时。(中间的人)因此,您需要确保用户名和密码的传输是安全的。(ssl或HTTP摘要)。如果安全性非常重要,那么您应该研究是否需要传递用户名\密码。(使用一些基于令牌的身份验证,如Oauth,而不是用户名和密码)
2-在这种情况下,如果您决定传入用户名和密码,您需要在您的应用程序范围内缩短密码字符串的生存期。当然,最好的方法是基于LDAP等机制实现身份验证过滤器。大多数LDAP存储将允许您存储加密的密码,并允许您通过绑定执行身份验证。(因此,您的应用程序永远不会担心abt身份验证和存储)
3-如果您将密码带到应用层,当然您仍然需要缩短明文密码的生命周期,并使用一些安全哈希算法进行加密。但这种方法和在数据库中存储密码(即使是加密形式)并不是那么安全。(特别是,由于您正在存储密码,有人可以绕过您的安全层)
总之,根据您需要的安全性,您需要问自己以下问题
1-您是否需要发送用户名/密码
2-你能确保不能通过网络嗅探密码吗
3-您不能将身份验证委托给前端过滤器,而不是应用层吗?您将因为提出这样的问题而面临许多自称安全专家的愤怒。我自己,不是一个安全前任