2

我想知道在我通过 POST 方法将密码从登录发送到处理页面之前,是否可以使用 bcrypt 对密码进行哈希处理,以提高登录脚本的安全性。我不能使用 SSL 保护来这样做。

4

2 回答 2

4

不幸的是,即使您按照您的建议进行操作,它仍然不会导致安全连接,从而使其容易受到中间人攻击。正如以下评论中所讨论的,您在客户端执行的任何散列都会使密码变得毫无意义,因为它需要您通过网络发送散列,以便与另一个散列服务器端进行比较。在这种情况下,攻击者 (MitM) 可以只使用哈希进行身份验证。

如果您想要安全通信,您必须(至少)实施 TLS/SSL。

于 2013-10-11T13:59:52.733 回答
2

如果您使用 bcrypt 对密码进行哈希处理,给定足够强的密码和盐,则密码将是安全的。

如果传入的哈希与服务器上的哈希不匹配,您可以拒绝访问。

但是,您的设计的主要问题是现在不再需要密码来访问系统。哈希现在成为验证所需的全部内容。因此,哈希已成为密码的合适替代品。好吧,您刚刚将未加密的公开伪密码传递给未经验证的服务器。

密码应该在使用 bcrypt 或类似的东西存储在服务器上之前进行哈希处理。但是,密码通常应该被传递到服务器(通过加密连接以明文形式)并在那里进行散列,以便您可以确保客户端实际上知道密码。

该方法的一种替代方法,而不是 SSL,您可能会考虑使用 Digest 身份验证,但这仅适用于对服务器的每次调用都经过重新身份验证。如果您使用任何类型的基于令牌的会话,它可能会受到重放和中间人攻击,因此必须对其进行加密。此外,摘要式身份验证有点陈旧,在密码学上不如 TLS 安全,而且没有服务器身份验证,所以我们最终还是回到了 HTTPS (SSL/TLS)。

HTTPS (SSL/TLS) 提供服务器身份验证并提供完整的端到端加密,这是您应该使用的。您可以模仿 SSL 提供的所有保护措施,但尝试做一些已经存在并且如此容易实施的事情似乎需要做很多工作。

于 2013-10-11T16:30:44.863 回答