有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

多谢各位


共 (3) 个答案

  1. # 1 楼答案

    bcrypt是一种可靠的密码哈希算法。它是由安全专业人员出于安全考虑而创建的

    bcrypt速度很慢(这是一件好事,这使得创建rainbow表的成本非常高)。您可以配置bcrypt具有可变数量的轮数,以根据您使用的任何硬件进行扩展(轮数越多=速度越慢)。此外,它还会自动处理salt生成,即每个散列生成不同的salt(这使得彩虹表攻击几乎不可能,因为bcrypt的速度很慢,而且每个密码需要一个完整的彩虹表)

    bcrypt的Java实现可在jBCrypt获得

  2. # 2 楼答案

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

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

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

    3-如果您将密码带到应用层,当然您仍然需要缩短明文密码的生命周期,并使用一些安全哈希算法进行加密。但这种方法和在数据库中存储密码(即使是加密形式)并不是那么安全。(特别是,由于您正在存储密码,有人可以绕过您的安全层)

    总之,根据您需要的安全性,您需要问自己以下问题

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

    2-你能确保不能通过网络嗅探密码吗

    3-您不能将身份验证委托给前端过滤器,而不是应用层

  3. # 3 楼答案

    您应该将安全地散列盐渍版本的密码存储到数据库中。因此,如果你的网站遭到黑客攻击,因为用户几乎在任何地方都使用相同的通行证,因此他们的其他帐户不会受到危害

    为此,应执行以下操作:

    1. 使用尚未中断的安全哈希算法(最好是SHA-512,Sha1和MD5已中断
    2. 连接用户名+密码+Salt(Salt应该是一个相对较长的常量字符串,在应用程序中始终是相同的,可以在一定程度上防止Rainbow攻击)
    3. SHA-512连接的结果,并将其存储在数据库中
    4. 每次用户尝试登录时,使用相同的方法散列他/她的凭据,并检查数据库中的数据,如果相同,则正确无误

    在哪里散列密码(应用或数据库)并不重要,但数据库的安全散列功能有限,所以应用是更好的选择