为什么不是所有网站都为用户生成密码?

信息安全 密码 密码管理 密码策略
2021-09-02 00:39:14

我遇到了这个问题,我从未见过这样做的网站,这是一个危险信号。然而,这种方法看起来很合理,它绕过了必须实施密码规则来强制使用强密码。此外,如果所有网站都这样做,它将确保用户不会重复使用密码。那么这种方法的缺点是什么?所有网站都不使用这种方法有充分的理由吗?

具体来说,我假设我们遵循该问题的评论和答案中出现的最佳实践,例如:

  • 生成一个长(32+ 字符)、随机(具有良好随机性)密码
  • 向用户展示一次
  • 用 SHA256 散列它
  • 重置密码会生成另一个长的随机密码

事实上,如果站点不向用户显示密码,而是简单地显示一个填写密码字段的表单,以便浏览器和/或密码管理员可以记住它,那么这种方法甚至可能会得到增强。用户只需提交表单,就不必看到它。

4个回答

以牺牲可用性为代价的安全是以牺牲安全为代价的

问题在于,Web 应用程序只能对用户强制执行良好的安全实践。在这种特殊情况下,我可以告诉你在绝大多数情况下会发生什么:人们会在一个不错但不安全的地方写下他们的“安全”密码。因此,这并不一定会让任何事情变得更安全:它只会在漏洞所在的位置随机移动。本质上,该系统缺少一些必要的支持架构,以使用户体验非常轻松,因此非常安全。结果基本上有三种人有三种不同的结果:

  1. 不关心/不了解密码安全性的人。他们将在一个超级容易访问的地方写下那个不可破解的密码,因此超级不安全。这些人在每个站点上重复使用相同的弱密码。结果,他们从一种糟糕的安全解决方案转向另一种糟糕的安全解决方案。这些也是大多数网络用户,因此对于大多数 Internet 而言,您的解决方案没有真正的好处。
  2. 使用密码管理器和其他密码助手的人,他们的密码系统无法与您的网站集成。这些人的情况会更糟,因为他们通常安全的系统突然无法再使用。结果,他们可能最终会写下来,可能不安全,并且比以前更糟。需要明确的是,这肯定会发生:您的“以表格形式显示密码以便密码管理器可以记录它”解决方案绝对不适用于某些密码管理器。我几乎可以保证。
  3. 使用密码管理器的人,以及那些密码管理器与您的系统正确集成。他们已经安全地存储了东西,现在仍然是,但现在有另一个故障点:你的随机数生成器。不过,总体而言,那里的安全性既不会减少也不会大幅增加。

因此,总的来说,我会说我认为这个系统没有真正的好处。

我必须大声说出来,因为它在所有其他情况下都至关重要:你永远不想使用 SHA256 来散列密码。在这种情况下,您可能可以使用快速散列,因为您的密码太长,无论如何都无法进行暴力破解。

编辑以添加明显的答案

我认为这个解决方案的最大问题是它还不足以解决根本问题。潜在的问题是人们对密码很敏感:我们要么选择糟糕的密码,重用它们,要么不安全地存储它们。解决方案不是想出一个新的密码系统:解决方案是一起放弃密码。许多公司开始引入无密码登录。这才是你真正想要的答案。

您的解决方案是强迫人们使用密码管理器。人们可能会将他们的密码保存在浏览器中,但这并不总是加密的,而且通常只存储在本地,因此他们现在无法从多台计算机访问您的服务。请记住,大多数人甚至都不知道密码管理器是什么。

此外,即使他们有密码管理器,他们是否可以在所有设备上访问它?如果有人不得不输入一个随机的 32 个字符的密码,甚至一次,他们就会开始讨厌你的网站。

我想到了两件事:

  1. 用户会讨厌无法选择自己的密码,因为除非他们已经拥有密码管理器或某种系统,否则他们必须记住或写下或跟踪某处是一件额外的事情。

  2. 如果网站承担了生成“随机”密码的责任,那么它生成密码的方法将来可能会出现缺陷,这将立即危及所有现有密码的安全性。我认为最近有一些硬件芯片在计算机中生成了 BitLocker 密码,其缺陷被发现了,现在所有这些 BitLocker 密码都可以在 AWS 上用大约 40,000 美元破解——这对个人来说是很多钱,但对于公司或政府来说,不是很多。

这种方法有什么缺点?

首先,这是一个额外的步骤,其他身份验证方法已大大减少。这对您的用户来说是额外的努力。密码……很容易忘记,这可能会成为一个违背密码目的的问题。最重要的是,与现实脱节的强密码规则是不安全的。

你可以通过那些在某个论坛上尝试最常用密码的人观察到这一点,结果发现他们因为忘记了一些晦涩、异常的规则而弄错了,所以他们继续鹦鹉学舌般的用户名和密码组合他们曾经使用过登录字段。如果您只是要与这样的随机陌生人共享密码,那么密码的意义何在?

每当我注意到这样做的网站时,我怀疑他们可能会巧妙地尝试通过网络钓鱼来获取其他网站的密码。就我而言,除非您现在是银行机构,否则如果您想被视为合法,您可能应该避免存储密码。有更好的方法,更可靠,更安全。

详细说明:除非您的用户有需要保护的东西,否则让他们使用任何他们想要的密码作为密码。也就是说,如果您决定使用密码,即使是空白密码也是可以接受的。


所有网站都不使用这种方法有充分的理由吗?

我运行某些人通常认为的“站点”,有时我允许其他人访问这些“站点”,而且我根本不存储密码或强制执行密码要求我使用证书进行身份验证(就像任何现代技术都应该使用的那样),人们可以(如果他们选择)用密码来保护这些证书。

我的网站是服务器,我不想存储其他人的密码是有充分理由的。如果我的一位用户设法获得对我的服务器的管理访问权限,他们可能会获得其他密码哈希。

同样,您可以看到这个站点,您可能不需要输入密码,因为您已经登录到 StackExchange 网络...... StackExchange 网络允许您使用 Facebook 或 Google 登录,所以也有.

证书认证并不是什么新鲜事;它已经在 PAM 中使用多年了,不需要密码验证,而且对于银行机构来说,使用起来肯定比密码更强大。


生成一个长(32+ 字符)、随机(具有良好随机性)密码

您可以这样做,但是当您忘记错误组织密码时,您最终会将某些服务的密码提供给其他服务。如果你对此感到满意,那就这样吧。如果您的银行账户被破解,世界不会停止旋转。

抱歉,您不会找到任何人争辩说生成一个长的、随机的密码比生成一个用于签署一些随机数盐并且从不直接存储在服务器端的长的、随机的私有证书更安全。


向用户展示一次

不应该向用户显示(除非密码是不重要的,例如您的互联网论坛),而是您的 SSH 密钥生成器应该在生成密钥时要求用户重复他们的密码。这与视觉验证具有相同的效果(可能甚至更强大),除了您没有以纯文本形式显示您的“密码”以供任何在您肩上观看的人看到......


用 SHA256 散列它

人们甚至可能会建议使用问题是,您仍在存储摘要,并且您的用户可能仍会为您提供其他服务的密码。“忘记密码”问题的解决方案不是尝试使用您曾经使用过的每个密码,从而大大削弱您的安全性,而是消除密码(从您的服务器)。


重置密码会生成另一个长的随机密码

由于某些其他技术,例如电子邮件或手机,即使是最强大的基于密码的身份验证方案也存在长期缺陷;当其中任何一个成为最薄弱的环节时,您会发现密码选项完全崩溃。

隐私和安全方面的前进方向是使用加密密钥进行身份验证,而不是使用电子邮件、电话号码、密码和 PIN 码。


事实上,如果站点不向用户显示密码,而是简单地显示一个填写密码字段的表单,以便浏览器和/或密码管理员可以记住它,那么这种方法甚至可能会得到增强。用户只需提交表单,就不必看到它。

解决方案是将密码存储在内存中的某个位置,这样人们只需访问该内存位置即可找到它?这对我来说似乎不是一个解决方案。使用物理的东西,例如 USB 笔式驱动器上受密码保护的 GPG 密钥。