使用salted密码进行身份验证

时间:2015-09-30 18:39:28

标签: security authentication bcrypt pbkdf2 scrypt

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

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

我怎样才能做到这一点?我到目前为止:我在客户端生成salt + hash,从中形成一个mcf并将其发送到我的服务器。将mcf保存到数据库。我没有发送密码,只是实际上没用的哈希(因为scrypt应该非常强大,并且需要几百万年的时间来反转它)。 我现在如何将用户登录到我的服务中,而不将明文密码发送到服务器进行比较?我无法重复它,因为它会因为不同的盐导致不同的哈希值?我需要将salt发送到客户端,散列密码,将散列发送到服务器,进行比较,然后再发送一些身份验证令牌。

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

2 个答案:

答案 0 :(得分:2)

  

不想通过电汇以明文形式发送密码,

好主意,但如果连接未加密(类似SSL / TLS),那么发送的任何内容都是明文。如果您在客户端散列密码,并通过网络发送,那么这就是密码。有人会说这里没有任何好处,但它确实阻止用户公开他们可能在其他网站上重复使用的实际密码。 (read more here

理想情况下,您可以使用SSL / TLS之类的东西来加密连接。我想如果这是不可能的,使用非正式加密和你正在发送的消息本身的证书将是重新发明轮子的好方法,但我犹豫是否建议没有安全人员查看它。它很容易搞砸,规则永远不会推出自己的加密方案。

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

  

我需要将salt发送到客户端,散列密码,将散列发送到服务器,进行比较,然后发送一些身份验证令牌

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

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

答案 1 :(得分:1)

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

我有两个来源可以为您提供正确的解决方法 if 您想要进行客户端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
  3. 它们是略有不同的解决方案,但基于相同的想法,并且要么对你来说应该足够好。