为什么要检查密码是否已被其他用户使用?

信息安全 密码管理 蛮力
2021-08-14 01:20:48

这来自一个法语笑话

输入您的密码。

carrot

抱歉,您的密码必须超过 8 个字符。

carottegéante
大胡萝卜

抱歉,您的密码必须包含数字

1carottegéante
1个大胡萝卜

抱歉,您的密码不能包含重音字符

50putaindecarottesgeantes
50该死的大胡萝卜

抱歉,您的密码必须至少包含一个大写字母

50PUTAINdecarottesgeantes
50该死的大胡萝卜

抱歉,您的密码不能包含两个连续的大写字母

5OPutainDeCarottesGeantesQueJeVaisTeMettreAuCulSiTuNeMedonnesPasImmediatementUnAcces!
如果你不立即给我访问权,我会把 50 根该死的大胡萝卜放在你的屁股里!

抱歉,您的密码不能包含标点符号

AttentionMaintenantJeVaisAllerTeTrouverEtTeMettreVraimentLes50CarottesGeantesSiTuContinues小心,再这样下去,我去找你,真的放50根大胡萝卜

抱歉,此密码已被使用。

但与朋友交谈:

  • 我说:

    这只是一个笑话:第三个答案有一个错字:ne s oit pas..而且,我根本不知道有任何用户创建引擎会检查已使用的密码。

  • 我朋友回答:

    你是对的,这是一个笑话,但你可以配置PAM做这样的检查:
    password required pam_pwcheck.so nullok remember=N

嗯,我不明白!

任何未经授权的人都可以通过简单地创建一个新(假)帐户来检查是否使用了密码!

这种检查的目标是什么?

3个回答

您误解了rememberfor 的用途pam_pwcheck请参阅手册页

记住=XX

记住最后的 XX 密码,并且不允许用户在下次更改 XX 密码时重复使用其中的任何密码。XX 是 1 到 400 之间的数字。

使用此选项,将拒绝重新使用同一用户pam_pwcheck以前使用过的密码的尝试它不会跨用户做任何事情;它不会警告您选择的密码是否被其他人使用。

事实上,如果有适当的密码散列,这样的检查实施起来会很昂贵(使用盐和多次迭代以降低速度,为成千上万的其他用户“尝试”假定的密码需要几分钟)。正如您所说,警告用户有关潜在密码已被其他用户使用的方式本身就是一个严重的安全问题。但这也意味着密码存储不正确,这是另一个严重的安全问题。

pam_pwcheck 正如另一个答案所说,只记住给定用户的密码。

问题的另一部分是,“这种检查的目标是什么?”

确实有系统会检查所有现有密码。通常,此类系统要么以明文形式存储密码,要么以不依赖于用户名或其他任何会阻止快速找到匹配的内容的未加盐哈希存储。我作为用户、作为功能请求(我拒绝以任何合理的方式存储密码,以及以下固有缺陷)或反对修复使用明文存储。

目标有两个:

  1. 由于密码应该难以猜测,理想的情况是它们在不可预测性方面接近随机(记住密码的问题是另一回事*,当人们对密码强度产生新的热情时,经常会忘记密码)。由于直觉上,随机意味着几乎没有重复的方式(这里的任何人都可能知道这是一个谬误,但肯定是一个谬误),因此重复是一个不好的迹象。

  2. 更合理的是,如果其他人正在使用密码,它可能是我们无法检测到的弱密码(例如,使用公司办公室的详细信息(例如电话号码)以其他员工可能尝试但通过其他方式通过的方式创建密码强度测试),这是可以猜到的,因为基本上用户确实只是猜到了。

第一个想法的缺陷是不理解随机性重复的缺陷,并且期望完全随机的密码,除非有允许安全记住难以记住的密码的策略支持。

第二个想法的缺陷是:

  1. 我们需要以相对不安全的方式存储密码,以便首先进行检查。
  2. 我们刚刚向某人泄露了密码。
  3. 我们可能已经识别出一个弱密码,但没有警告实际使用它的人。

但是,这些缺陷并不意味着它不会发生。毕竟这个笑话的系统还有另一个缺陷;拒绝carottegéante因为变音符号。在各个地方都有拒绝变音符号的技术原因(尽管除非您必须与其他人的代码互操作,否则这些原因在现代代码中是完全不可原谅的),但我很奇怪地看到它被接受变音符号的系统拒绝用户名!同样,许多系统拒绝密码中的空格,等等。一般来说,我会把它归结为货物狂热的编程。别人做了,所以你复制它。在某种程度上,这并非完全不合理。我当然会抄袭那些比我更了解安全的人所做的事情,所以我不会完全责怪某人盲目抄袭此类政策。尽管如此,只需要短暂的停顿就可以意识到接受“jdiwmfojkslofklo”但不接受“ﬤסּוּﭞﻘﺪӐӓҾӌȕ”是不可能的

无论如何,一些系统对空格的规则为我们提供了一种将笑话翻译成英语的方法。使第二个密码尝试带有空格的“巨型胡萝卜”。

*这就是便利贴的用途,不是吗?

您永远不应该在网关上存储用户密码。

最常见的方法是从密码中获取散列,并仅存储此散列。在这个范围内,你可能会说有碰撞,但你不应该。

加盐的最好方法是连接 username.password 并从此组合中获取哈希:

用户名/md5sum(str(用户名) + str(密码))

看,md5sum 不再安全

最好使用 sha256:

用户名 / sha256sum(str(username) + str(password))

这是解决方案的草图,您可能会发现更强大和更智能的解决方案。