在客户端浏览器中进行密码哈希处理

6
在将用户密码发送到Web服务器之前,客户端浏览器如何最好地对其进行哈希处理,以便仅发送哈希值而不是明文密码?(假设使用HTTP而非HTTPS)

7
我希望你会在安全通道上传输哈希值,或者这是挑战/响应机制的一部分。否则,这将不比明文发送密码更加安全。 - Roger Lipscombe
1
@Roger Lipscombe,这种方法实际上可能会对用户有所改善。即使没有可用的安全通道(只有SSL才能工作,没有JS替代方案是防弹的),它也至少会使哈希在该网站上唯一。当然,为了使哈希唯一,必须加盐 - Inshallah
1
假设这将使哈希对该站点唯一 -- 如果用户在多个站点上使用相同的密码,则非常有用;但无法防止对同一站点的重放攻击。 而且,如果哈希值被加盐,那么盐要么必须从客户端传输到服务器 -- 安全性不比以前更高;要么反过来,这种情况下它就是挑战/响应。 - Roger Lipscombe
唯一的密码正是我所指的,但为了澄清盐的问题;它只是为了让监听连接的人非常难以暴力破解原始密码(考虑数据库存储)。此时,用户正在访问的特定站点的身份验证已经被破坏,但根据站点而定可能还可以接受,而暴露个人信息,例如用户选择的密码,则不行。 - Inshallah
顺便提一下,由于该帖子似乎没有SSL可用,我认为挑战/响应并不可行,因为它取决于共享密钥;也就是说,已经进行了身份验证和加密通信(例如在注册时使用的SSL)。 - Inshallah
7个回答

5
使用JavaScript计算哈希值。可以参考此链接,了解如何在JS中计算SHA-1哈希值。
需要注意的是,如果你依赖JavaScript,当有人禁用JS时,你的系统将会失败。如果这让你担忧,建议使用HTTPS,但这也有自己的缺点(例如,如果想要证书被浏览器立即接受,则需要花费一定的金钱)。

2
尝试使用这个jQuery加密插件。好奇的是,为什么不能使用SSL / HTTPS并在服务器端进行加密?

1

并非所有人都在其浏览器中启用了JavaScript,甚至在明文通道上发送哈希的想法我认为并不足够安全。

我建议您考虑使用SSL安全连接。


现在(2018年)几乎所有的用户都启用了JavaScript。 - Jeferson Tenorio

1

1

像jQuery加密库这样的JavaScript端加密可以阻止窃听者。然而,中间人攻击(MITM)仍然可能发生。除非您使用共享主机(没有专用IP)或您的网站接收的流量太大,无法简单地加密所有连接(JS、CSS、HTML等),否则强烈建议选择SSL/TLS作为最终选择。


1

你为什么要这样做呢?实际上,密码哈希已经成为了密码,如果一个中间人拦截了哈希值,他就可以使用它来进行身份验证并以用户的身份执行任何操作。另一方面,如果你不相信中间人攻击,为什么不直接发送密码本身呢?


挑战-响应机制可以防范窃听攻击,即攻击者无法修改数据,只能监听数据。由于令牌是一次性的,窃听者总是来得太晚,不能利用令牌。 - Tower
是的,我想这确实可以防止仅限窃听的攻击者发现密码。但在这种情况下,我会选择使用HTTP摘要认证而不是自己编写。 - erickson

1
为什么要对密码进行哈希?这是为了使得如果哈希值被获取,它们很难被使用。
如果系统中的哈希值暴露了,攻击者可以将其发送到服务器并作为用户进行认证。这就是为什么密码哈希始终在服务器上进行,而不是在客户端上!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接