【问题标题】:Is there any way to hash a password with bcrypt before sending it with POST method?在使用 POST 方法发送密码之前,有什么方法可以使用 bcrypt 对密码进行哈希处理?
【发布时间】:2013-10-19 15:13:42
【问题描述】:

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

【问题讨论】:

  • 这不会提高您的安全性,仍然有人可以嗅探您的流量并获取哈希密码,然后使用该密码进行身份验证。
  • 那么有没有办法在没有 SSL 的情况下提高安全性。
  • 不想告诉你这个,但这就是 https/ssl 的用途。这就是它被制作的原因。无论/谁阻止您使用 SSL,都会阻止您拥有安全的应用程序。
  • 谢谢大家的回复。我会尝试使用 SSL 然后我可以

标签: javascript security passwords http-post bcrypt


【解决方案1】:

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

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

【讨论】:

  • 但是仍然有任何方法可以使用 bcrypt 对密码进行哈希处理。我发现在 ruby​​ 中有一个 bcrypt 的实现。我可以用红宝石做吗?
  • (我不是 Ruby 程序员,但是...)Ruby 仍然是一种服务器端语言,因此您一开始仍会以明文形式发送密码。如果您要在客户端对其进行散列,然后在服务器上验证该散列,则您的散列本质上将成为新密码,您仍以明文形式发送。
  • 我无法理解,如果使用中间人攻击可以窃取信息,那么为什么从客户端散列密码不会提高安全性
  • @MarcusAdams 和 Sid,他不需要反转 bcrypt 哈希,我的意思是加密选项,而不是哈希。无论如何,这并不重要:当攻击者可以访问数据库中的密码时,散列是为了提高安全性。为了防止中间人,您需要一个安全的连接。散列密码客户端将使攻击者无法知道密码。它还会使您不知道密码。如果要对它们进行身份验证,则必须比较哈希值。这意味着攻击者可以使用可访问的哈希进行身份验证。
  • @Sid,马库斯亚当斯。这对于 SO 来说已经离题了。如果您想了解更多信息,可以在 Security.stackexchange 上发帖,那里知识渊博且专业的人可以帮助解释为什么客户端散列不会提高安全性。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • +1 以获得清晰的解释;你能检查我的编辑,看看它现在是否更准确/清晰。我不觉得你说了什么与我所说的相反的话,只是我的措辞模棱两可。
  • 谢谢大家。我将为我的登录脚本使用 SSL 保护
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2019-04-21
  • 2018-07-25
  • 2011-03-04
  • 1970-01-01
  • 2018-10-31
相关资源
最近更新 更多