unix/linux 系统上密码的最大允许长度是多少?
答案1
如果您的系统使用加密哈希来存储密码,即 MD5、SHA1 等,那么密码长度本身就没有限制,因为这些哈希可以用任意数量的数据创建。可以为整个硬盘创建 MD5 或 SHA1 哈希,这通常用于取证目的,因为即使只有一位发生轻微更改,也会得到非常不同的哈希,从而可以验证数据是否已更改。这意味着您可以使用完全相同的算法来测试数据是否被篡改。Linux(至少是当前的 Linux)使用相同的哈希函数。它会要求您输入密码,然后创建您提供的密码的加密哈希,并查看此哈希是否与存储的密码匹配。这也意味着您的密码不是以纯文本形式存储的,恢复丢失密码的唯一方法是运行暴力测试,该测试会生成一个又一个密码哈希,直到找到一个与当前哈希匹配的哈希,然后您就得到了密码。
使用这些哈希值有一个缺点,那就是哈希值的大小是有限的,例如 MD5 哈希值为 128 位。这意味着 MD5 哈希值只有2^128
或340,282,366,920,938,463,463,374,607,431,768,211,456
可能的组合。虽然这是一个很大的数字,但这意味着您可以获得所谓的哈希碰撞,即您有两个不同的项目或密钥产生相同的哈希值。理论上,密钥大小越大,发生碰撞的概率越低,暴力破解密码所需的时间越长,但这严格评估的是熵以及它需要多长时间能但也有可能他们尝试的第一个条目就是匹配的条目,即使它是哈希冲突。一般来说,使用具有较大密钥大小的哈希确实更安全,因为假设这是 MD5,那么在340,282,366,920,938,463,463,374,607,431,768,211,456
可能的匹配中第一个密码匹配的几率极小。还要选择一个好的密码,因为许多破解者在依靠暴力破解密码之前会尝试使用单词列表、名称列表和这些列表的变体(例如,如果单词是“fish”,那么他们会尝试fish1234
等fish!@#$
)。
您可以通过查看文件来判断系统是否使用加密哈希值来存储密码/etc/shadow
(假设您具有 root 访问权限)。每一行的格式都像user:password:last-changed:minimum-age:maximum-age:warning-period:inactivity-period:expiration-date:reserved
。密码字段可能以 开头$num$
(即,密码字段中的 md5 哈希值看起来像$1$01234567$b5lh2mHyD2PdJjFfALlEz1
以 开头$1$
)。如果以此开头,则表示您的系统正在使用加密哈希值。所有现代系统上密码字段的格式为$id$salt$hash
。id 指定您正在使用的加密哈希值类型。salt 是一个随机生成的字符串,它与密钥(纯文本密码)连接在一起,以防止已知哈希值的预先计算表。哈希值是根据盐和密钥/密码创建的加密哈希值。如果您的密码字段以 开头,$num$
那么您正在使用加密哈希值。
你知道,这些数字的含义是:
$1$
表示你正在使用 MD5$2$
或者$2a$
意味着你正在使用 blowfish$5$
表示你正在使用 SHA-256$6$
表示你正在使用 SHA-512
SHA-512 是 glibc 提供的最佳哈希算法。我不知道 blowfish 有多强,但它不是 glibc 的一部分,因此只在添加了它的某些发行版上可用。SHA-512 会产生 512 位密钥或 2^512 种可能的组合,然后才会发生冲突,如果密码足够复杂,一组计算机需要很长时间才能找到实际密码或哈希中的冲突。
此外,如果您的哈希不是以开头,$num$
则表示您使用的是 DES,并且其长度限制为 8 个字符。我相信使用 DES 的旧系统(或至少其中一些系统)会接受任何长度的密码,但仅使用前 8 个字符。这意味着如果您将密码设置为,mybigbigapple
并且有人使用该密码,mybigbigcity
那么他们将被允许进入,因为 DES 只会使用mybigbig
,并且之后的任何内容都会被丢弃。
你知道,Ubuntu 8.04(2008 年 4 月发布)使用 MD5 哈希。Ubuntu 8.10(2008 年 10 月发布)以及此后的所有版本都使用 SHA-512 哈希。我不知道 2008 年 4 月之前有多久,但我相信几年甚至更久,大多数发行版都使用哈希。
Ubuntu 当前的 12.04 和 14.04 LTS(长期支持版本)似乎默认使用 SHA-512,从$6$
/etc/shadow 文件中哈希前面添加的内容可以看出:
catullus:$6$MsHYK60sqcv$BtDqVCMXibpqg[...]
现在,任何哈希算法允许的密钥或密码长度并不是决定您允许使用多大密码的唯一因素。另一个值得关注的问题是程序的编写方式以及程序本身将支持多大长度。所有现代 passwd 程序以及crypt(3)
Linux 中的大多数函数。crypt for a long long(至少自从使用 MD5 以来,可能更早)允许实际密钥使用字符指针。这意味着它接受的密钥长度的唯一限制取决于该程序有多少可用的 RAM,但很有可能,这可能比任何人能够记住的任何密码(数百万个字符?)都长得多。
这应该可以回答你关于密码可以有多长的问题。希望我能帮到你。
参考:
答案2
这取决于使用哪种身份验证模块。在现代 Linux 系统中,密码长度没有最大限制。一些过时的系统可能会对其密码存储系统施加限制 - 流行的最大值似乎是 8、40 和 255。
答案3
根据密码的存储方式,MD5,SHA1,BlowFish等,我认为存储方法本身对密码没有限制。
较旧的实现可能有 8 个或 255 个字符的限制。
这似乎更适合www.serverfault.com尽管 :)
答案4
除了上面提到的哈希算法限制(或不存在限制)之外:
实际上,用户帐户至少还有两个限制需要考虑:
如果我选择例如 8k 密码,Ubuntu 会在控制台中打印错误,尽管它仍然可以登录。如果我粘贴 8k 密码,情况就是这样。
如果我在无法粘贴的终端中手动输入密码,则登录会在我输入完密码之前超时,我必须重新开始。