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