起始页检查客户端散列密码是否安全?

Is it safe for a starting page to check password hashed on clientside?

启动 Web 应用程序通过 javascript 密码与硬编码散列密码进行检查是否安全?

即:

if (md5HashFunction(password) === '4c98fecb7fdbf0c3b848f95c92c3402e') {
    alert('you are admin');
    window.location.href=window.location.href+'/'+password;
}

攻击者有什么方法可以找到与管理路径网页中的 condition/find 相匹配的密码? (www.sample.com/真实密码)

不,这不安全。客户端验证从来都不安全。以下是部分原因:

  1. 您正在发布哈希。这意味着攻击者知道密码何时被更改(或未更改)并且可以离线破解它而不是尝试攻击服务本身。

  2. MD5 不应再用于密码。它很弱,有已知问题,并且与所有其他哈希相比很容易破解。我可以从字面上 google 获取此哈希值并获取您的密码 (colibri) http://md5decoder.org/4c98fecb7fdbf0c3b848f95c92c3402e

  3. 您正在使密码成为 URL 路由的一部分。这可能会引入新的弱点。例如,如果我可以强制您的服务出错并转储一些有关路由不匹配的信息。或者如果路由匹配代码允许定时攻击发现可能的路由。

  4. URL中的密码将保存在浏览器历史记录中,不像表单密码可以由用户控制。这允许有权访问您的浏览历史记录的任何人获取它。

  5. 密码现在是服务路由的一部分,这意味着人们会 copy/paste 它并可能在其他地方暴露它。甚至可能 google 索引的地方。

  6. 会有更多的可能性...只是不要这样做。

在起始页中检查密码哈希值似乎不是个好主意。

对于这个问题,更安全的身份验证协议通常会跳过许多环节,以确保这种重放攻击不会起作用,通常是允许客户端 select 一堆随机的与密码一起散列的位,也以明文形式提交给服务器。

在服务器上:

  • 随机生成几位
  • 将这些位(以明文形式)发送给客户端

在客户端:

  • 生成一些随机位
  • 连接密码,服务器的随机位和客户端的随机位 位
  • 生成上面的散列
  • 向服务器提交随机数据(以明文形式)和散列

由于服务器知道它自己的随机信息以及客户端的随机位(它以明文形式获取它们),因此它可以执行基本相同的转换。该协议确保,只要双方每次生成不同的 "noise bits" , 执行握手。

如果我是你我会读this thread两遍