1

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

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

您必须使用非对称加密,只有服务器可以解密数据。

于 2015-09-30T20:06:46.630 回答
1

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

如果您想进行客户端 scrypt 处理 ,我有两个资源可以为您提供有关正确方法的详细说明。

  1. 保护 Web 应用程序数据库中密码的方法。如果您不想了解所有基本原理,只需跳到第 4 节查看实现(其中 PPF = 您的 scrypt)。
  2. 客户端加服务器密码散列作为一种潜在的方法来提高安全性,防止暴力攻击而不会使服务器过载

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

于 2015-09-30T22:50:16.227 回答