Javascript 在用POST方法发送密码之前,有没有办法用bcrypt散列密码?

Javascript 在用POST方法发送密码之前,有没有办法用bcrypt散列密码?,javascript,security,passwords,http-post,bcrypt,Javascript,Security,Passwords,Http Post,Bcrypt,在通过POST方法将密码从登录发送到处理页面之前,我想知道是否有方法使用bcrypt散列密码,以提高登录脚本的安全性。我无法使用SSL保护来执行此操作。不幸的是,即使您按照您的建议进行操作,也不会导致安全连接,从而使其容易受到攻击。正如在下面的评论中所讨论的,您在客户端进行的任何散列都会使密码变得毫无意义,因为它需要您通过线路发送散列,以便与另一个散列服务器端进行比较。在这种情况下,攻击者(MitM)可以使用哈希进行身份验证 如果您想要安全通信,您必须(至少)实现TLS/SSL。如果您使用bcr

在通过POST方法将密码从登录发送到处理页面之前,我想知道是否有方法使用bcrypt散列密码,以提高登录脚本的安全性。我无法使用SSL保护来执行此操作。

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


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

如果您使用bcrypt对密码进行哈希运算,给定足够强的密码和salt,则密码将是安全的

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

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

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

一种替代方法,而不是SSL,您可以考虑的是摘要身份验证,但这仅是因为对服务器的每次调用都是经过重新认证的。如果您使用任何类型的基于令牌的会话,它都可以用于重播和MitM攻击,因此必须对其进行加密。此外,摘要身份验证有点陈旧,在加密方面不如TLS安全,并且没有服务器身份验证,因此我们仍然返回HTTPS(SSL/TLS)


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

这不会提高您的安全性,有人仍然可以嗅探您的流量并获取哈希密码,然后使用它进行身份验证。那么,有没有任何方法可以在没有SSL的情况下提高安全性呢?我不想告诉你这一点,但这就是https/SSL的用途。这就是它被制造出来的原因。无论谁阻止你使用SSL,都会阻止你拥有一个安全的应用程序。谢谢你们的回复。我将尝试使用SSL,然后我可以,但是仍然有任何方法可以使用bcrypt散列密码。我发现在ruby中有一个bcrypt的实现。我可以用ruby来做吗?(我不是ruby程序员,但是…)ruby仍然是一种服务器端语言,所以你还是会先用明文发送密码。如果你要把它散列在客户机上,然后在服务器上验证哈希,你的哈希本质上变成了新密码,你仍然用明文发送。我无法理解,如果信息可以用中间人攻击来窃取,那么,为什么从客户端散列密码不会得到改进呢security@MarcusAdamsSid,他不需要反转bcrypt散列,我的意思是加密选项,而不是散列。无论如何,这并不重要:当攻击者可以访问数据库中的密码时,哈希是为了提高安全性。为了防止中间人,你需要一个安全的连接。散列密码客户端将阻止攻击者知道密码。这也会让你不知道密码。如果要对它们进行身份验证,必须比较散列。这意味着攻击者可以使用可访问的哈希值进行身份验证。@Sid,MarcusAdams。这太离题了。如果您想了解更多信息,可以在Security.stackexchange上发表文章,在那里,知识渊博、专业程度更高的人可以帮助解释为什么客户端哈希不能提高安全性;你能检查一下我的编辑,看看现在是否更准确/清晰。我不觉得你说了什么与我说的相反的话,只是我的措辞模棱两可。谢谢大家。我将对登录脚本使用SSL保护