为什么大多数应用程序验证密码不正确需要这么长时间?

第8位

SSH 和 *NIX 登录通常会特别浮现在我的脑海中,尽管我已经在许多不同的应用程序中看到了这一点,包括 Windows 登录。由于某种原因,它在网络应用程序中似乎不太常见。该过程不只是“对输入密码进行散列并将其与现有散列进行比较”吗?无论密码是否正确,这不是一样的成本吗?在 *NIX 中,您可以毫无问题地终止登录尝试,因此它对重复尝试的攻击者没有太大的威慑力。

丹尼尔的陈词滥调

通常,如果登录失败,会有一个人为的随机等待时间。这是为了防止定时攻击。如果密码未经散列存储(或使用弱散列方法),这可以防止攻击者测量系统比较两个密码字符串所用的时间。让我们假设正确的密码是“abc”。现在攻击者会反复尝试密码“a”到“z”,并看到密码“a”拒绝登录的时间比“b”到“z”更长。那是因为系统必须将两个字节(“a”和空字节)与真实密码进行比较,才能意识到“a”不是正确的密码。然后攻击者会尝试从 'aa' 到 'az',他可以意识到对于 'ab' 系统需要更长的时间才能意识到密码错误。使用这种方法可以大大减少搜索空间,从而减少暴力破解密码所需的时间。如果在比较密码后通过添加伪随机等待时间来弥补这一点,则测量系统比较两个密码所花费的时间变得更加困难。如果登录过程测量比较密码所需的时间,然后从随机等待时间中减去该时间,则更是如此,以防止通过统计异常检测来绘制信息。显然,如果使用不存在彩虹表的强散列方法对密码进行散列,那么这将变得毫无意义,因为人们无法有目的地生成具有特定散列前缀的密码。

此外,这也减少了攻击者可能尝试密码的次数,因为在该连接上尝试下一个密码之前必须中止登录(在 ssh 的情况下)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么安装大多数应用程序需要root密码?

为什么在大多数实时应用程序中首选c而不是java

为什么大多数休眠应用程序都使用序列来生成ID?

为什么大多数应用程序协议都分配了两个端口?

为什么我的应用程序抽屉中显示了两个大多数默认应用程序?

为什么我在 Node.js 上的 localhost 应用程序需要这么长时间/拒绝连接?

为什么大多数应用程序的每次更新都意味着只是重新下载整个程序

大多数应用程序需要明确的管理员权限

为什么我的程序需要这么长时间才能运行?

为什么大多数安装程序无法正常工作?

为什么 IndexOrDocValuesQuery 需要这么长时间?

为什么排序需要这么长时间?

为什么mkntfs需要这么长时间?

对于任何 Win OS 上的大多数多线程应用程序,CPU 最大利用率限制为 1/N 个 CPU:为什么?

Postgres:了解为什么查询从应用程序中花费这么长时间但在psql中可以正常工作

Node.js应用程序需要很长时间才能启动并连接?为什么?

为什么UWP应用程序需要很长时间才能启动?

为什么我的应用程序图标在 Apple App Store 上显示不正确?

为什么NBug HostApplicationVersion显示的应用程序版本不正确?

为什么cons的嵌套应用程序会构造不正确的列表?

是什么原因导致大多数应用程序的右上角刻有“ NORMAL”一词

为什么此GAS脚本需要这么长时间才能加载数据验证选项?

为什么识别不正确的密码要比识别正确的密码花费更多的时间?

为什么我的简单cpp-netlib程序需要这么长时间才能编译?

为什么修补程序145006需要花费这么长时间安装?

为什么打开多个文件需要这么长时间?

为什么sencha touch需要这么长时间才能加载?

为什么查找中间节点的查询需要这么长时间?

为什么在Ruby中迭代需要这么长时间?