【问题标题】:Authentication with salted password使用加盐密码进行身份验证
【发布时间】:2015-12-28 16:04:01
【问题描述】:

我正在使用scrypt 来生成用户密码的强哈希值。我想登录用户,但不想通过网络以明文形式发送密码,我如何检查密码是否正确(没有往返),因为它是加盐的?

我有一个客户端/服务器方案。客户端是桌面计算机上的应用程序(不是网站,也不是 http 服务器)。

我怎样才能做到这一点?我只走了这么远:我正在客户端上生成盐 + 哈希,从中形成一个 mcf 并将其发送到我的服务器。将 mcf 保存到数据库。我没有发送密码,只是几乎没用的哈希(因为 scrypt 应该非常强大,并且需要几百万年才能恢复它)。 我现在如何将用户登录到我的服务,而不将明文密码发送到服务器进行比较?我不能重新散列它,因为它会由于不同的盐而导致不同的散列?我需要将盐发送到客户端,对密码进行哈希处理,将哈希发送到服务器,进行比较,然后发回一些身份验证令牌。

我怎样才能做到这一点?身份验证令牌真的安全吗?我猜它可以简单地用来冒充任何人?

【问题讨论】:

    标签: security authentication bcrypt pbkdf2 scrypt


    【解决方案1】:

    不想通过网络以明文形式发送密码,

    好主意,但如果连接没有加密(例如 SSL/TLS),那么无论您发送什么都是纯文本。如果您在客户端散列密码并通过网络发送,那么这就是密码。有人会说这里没有任何好处,但它确实可以防止用户暴露他们的实际密码,他们可能会在其他网站上重复使用这些密码。 (read more here)

    理想情况下,您应该使用 SSL/TLS 之类的东西来加密连接。我想如果这是不可能的,那么在您发送的消息本身上使用带有证书的非对称加密将是一种重新发明轮子的好方法,但我不愿建议在没有安全人员检查的情况下这样做。这很容易搞砸,而且规则是永远不要推出自己的加密方案。

    如果你不能验证/无效/更新公钥,那么这不是一个好的方案。

    我需要将盐发送到客户端,对密码进行哈希处理,将哈希发送到服务器,进行比较,然后发送一些身份验证令牌

    盐不应该是超级机密,但就这样放弃它并不是很好,尤其是对未经身份验证的用户。如果连接未加密,则身份验证令牌、哈希、盐等都可以被拦截。即使他们不能,你也没有解决用户通过这种方法创建帐户的问题(也许你不需要,但值得一提)。

    您必须使用只有服务器才能解密数据的非对称加密。

    【讨论】:

    • then THAT is the password。多哈。你是对的。常见应用程序如何处理中间人攻击?我显然正在通过 SSL/TLS 进行任何通信。我还考虑过使用 HMAC 来验证所有带有一些哈希的请求,但无论如何我必须至少发送一次,这使得它毫无用处。
    • “我显然正在通过 SSL/TLS 进行任何通信。”那你就做对了,兄弟。在底层,TLS 使用 HMAC 来确保修改消息会导致错误。你的设置听起来很安全 - 因为密码实际上不是明文。使用 TLS,攻击者应该无法对您进行 MitM 攻击 - 这需要在本地计算机上使用您受信任的 CA。
    • 我在和我的一个朋友讨论这个问题,SSL 基本上是使用公钥/私钥加密,对吧? (类似于this)。哪个与您提到的非对称加密相同?
    • @Leandros 你是对的。这正是 SSL 的本质。我试着想如果有人告诉我我不能将它与我发表的评论一起使用,我会怎么做。现在我们知道您的连接是安全的,这是一个有争议的问题。
    【解决方案2】:

    您的问题没有简短的答案,因为如果您做错了,可能会出现很多陷阱。但正如 Gray 所说,您确实需要 TLS 保护。

    我有两个资源可以为您详细解释正确的方法如果您想要进行客户端 scrypt 处理。

    1. Method to Protect Passwords in Databases for Web Applications。如果您不想了解所有基本原理,只需跳到第 4 部分查看实现(其中 PPF = 您的 scrypt)。
    2. Client-Plus-Server Password Hashing as a Potential Way to Improve Security Against Brute Force Attacks without Overloading the Server

    它们是略有不同的解决方案,但基于相同的想法,并且对您来说应该足够好。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 2019-06-01
      • 2020-02-28
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2022-12-16
      相关资源
      最近更新 更多