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

Java 如何在web应用程序中管理密码?,java,mysql,passwords,password-protection,Java,Mysql,Passwords,Password Protection,在web应用程序中保存用户密码的最新方法是什么?我正在使用Java6+MySQL。我想问的一些问题是:在应用程序中编码还是通过DBMS编码更好(这是否相关)?哪种算法被认为是可靠的?在数据库中存储什么?真的是新的东西,所以可能会错过一些关键的细节,在这种情况下,请不要犹豫让我知道 谢谢。您应该将安全地散列和盐渍版本的密码存储到数据库中。因此,如果你的网站遭到黑客攻击,因为用户几乎在任何地方都使用相同的通行证,因此他们的其他帐户不会受到危害 为此,应执行以下操作: 使用尚未损坏的安全哈希算法(最好

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


谢谢。

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

为此,应执行以下操作:

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

  • 在何处散列密码(应用程序或数据库)并不重要,但数据库的安全散列功能有限,因此应用程序是更好的选择。

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

    为此,应执行以下操作:

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

  • 在何处散列密码(应用或数据库)并不重要,但数据库的安全散列功能有限,因此应用是更好的选择。

    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-您不能将身份验证委托给前端过滤器,而不是应用层吗?

    您将因为提出这样的问题而面临许多自称安全专家的愤怒。我自己,不是一个安全前任