ps-*_*aux 146 linux security unix
有几次我尝试在各种 Linux 机器上更改用户密码,当新密码与旧密码相似时,操作系统抱怨它们太相似了。
我一直在想,系统怎么知道这个?我认为密码保存为哈希。这是否意味着当系统能够比较新密码的相似性时,旧密码实际上被保存为纯文本?
slh*_*hck 155
由于您在使用时需要同时提供旧密码和新密码passwd,因此可以在内存中以明文形式轻松比较它们,而无需将它们写在驱动器的某处。
实际上,您的密码在最终存储时会被散列,但在此之前,您输入密码的工具当然可以直接访问它,就像任何其他程序可以访问您在从 STDIN 读取时在键盘上输入的内容一样。
这是在工具后台使用的PAM 系统的一个特性passwd。现代 Linux 发行版使用 PAM。
更具体地说,它pam_cracklib是一个 PAM 模块,它允许基于几个使密码非常脆弱的弱点拒绝密码。
不仅仅是太相似的密码可以被认为是不安全的。该源代码 具有什么可以检查各种示例中,例如,密码是否是回文或什么编辑距离是两个单词之间。这个想法是使密码更能抵抗字典攻击。
Dam*_*lli 46
至少在我的 Ubuntu 中,出现了“太相似”的消息 当:“......超过一半的字符是不同的......”(详情见下文)。 感谢 PAM 的支持,正如@slhck 的回答中清楚地解释的那样。
对于其他不使用 PAM 的平台,在以下情况下会出现“太相似”消息:“......超过一半的字符是不同的......”(详情见下文)
要自己进一步检查此语句,可以检查源代码。这是如何。
“passwd”程序包含在 passwd 包中:
verzulli@iMac:~$ which passwd
/usr/bin/passwd
verzulli@iMac:~$ dpkg -S /usr/bin/passwd
passwd: /usr/bin/passwd
Run Code Online (Sandbox Code Playgroud)
当我们处理开源技术时,我们可以不受限制地访问源代码。获取它很简单:
verzulli@iMac:/usr/local/src/passwd$ apt-get source passwd
Run Code Online (Sandbox Code Playgroud)
之后很容易找到相关的代码片段:
verzulli@iMac:/usr/local/src/passwd$ grep -i -r 'too similar' .
[...]
./shadow-4.1.5.1/NEWS:- new password is not "too similar" if it is long enough
./shadow-4.1.5.1/libmisc/obscure.c: msg = _("too similar");
Run Code Online (Sandbox Code Playgroud)
快速检查“obscure.c”给出了这个(我只剪切并粘贴了相关的代码段):
static const char *password_check (
const char *old,
const char *new,
const struct passwd *pwdp)
{
const char *msg = NULL;
char *oldmono, *newmono, *wrapped;
if (strcmp (new, old) == 0) {
return _("no change");
}
[...]
if (palindrome (oldmono, newmono)) {
msg = _("a palindrome");
} else if (strcmp (oldmono, newmono) == 0) {
msg = _("case changes only");
} else if (similar (oldmono, newmono)) {
msg = _("too similar");
} else if (simple (old, new)) {
msg = _("too simple");
} else if (strstr (wrapped, newmono) != NULL) {
msg = _("rotated");
} else {
}
[...]
return msg;
}
Run Code Online (Sandbox Code Playgroud)
所以,现在,我们知道有一个“相似”的函数,它基于旧函数和新函数来检查两者是否相似。这是片段:
/*
* more than half of the characters are different ones.
*/
static bool similar (const char *old, const char *new)
{
int i, j;
/*
* XXX - sometimes this fails when changing from a simple password
* to a really long one (MD5). For now, I just return success if
* the new password is long enough. Please feel free to suggest
* something better... --marekm
*/
if (strlen (new) >= 8) {
return false;
}
for (i = j = 0; ('\0' != new[i]) && ('\0' != old[i]); i++) {
if (strchr (new, old[i]) != NULL) {
j++;
}
}
if (i >= j * 2) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我还没有查看 C 代码。我限制自己相信函数定义之前的评论:-)
PAM 和非 PAM 感知平台之间的区别在“obscure.c”文件中定义,其结构如下:
#include <config.h>
#ifndef USE_PAM
[...lots of things, including all the above...]
#else /* !USE_PAM */
extern int errno; /* warning: ANSI C forbids an empty source file */
#endif /* !USE_PAM */
Run Code Online (Sandbox Code Playgroud)
Cor*_*mon 36
答案远比你想象的简单。事实上,它几乎可以称为魔术,因为一旦你解释了这个技巧,它就消失了:
$ passwd
Current Password:
New Password:
Repeat New Password:
Password changed successfully
Run Code Online (Sandbox Code Playgroud)
它知道您的新密码是相似的...因为您刚才输入了旧密码。
尽管其他答案是正确的,但值得一提的是,您无需提供旧密码即可正常工作!
事实上,可以生成一堆类似于您提供的新密码的密码,对它们进行散列,然后检查这些散列中的任何一个是否与旧的相匹配。如果是这样,那么判断新密码与旧密码相似!:)
一个方面没有涉及:密码历史。一些系统支持这一点。为此,它会保留密码历史记录并使用当前密码对其进行加密。当您更改密码时,它会使用“旧”密码来解密列表并进行验证。当它设置新密码时,它会保存(再次)使用从新密码派生的密钥加密的列表。
这就是remember=NPAM 中的工作方式(存储在 中/etc/security/opasswd)。但 Windows 和其他 Unix 供应商也提供类似的功能。
| 归档时间: |
|
| 查看次数: |
17378 次 |
| 最近记录: |