unix/linux 系统密码的最大长度是多少?

har*_*ari 29 linux unix passwords

unix/linux 系统上允许的最大密码长度是多少?

小智 43

如果您的系统使用加密散列来存储密码,即 MD5、SHA1 等,那么密码长度本身没有限制,因为这些散列可以使用任意数量的数据创建。可以为整个硬盘驱动器创建 MD5 或 SHA1 散列,这通常用于取证目的,因为即使一位更改如此轻微,那么您的散列就会非常不同,因此您可以验证数据是否已更改。这意味着您可以使用这些完全相同的算法来测试数据是否被篡改。Linux(至少当前的 Linux)使用这些相同的哈希函数。它会要求您输入密码,然后它会创建您提供的密码的加密散列,并查看该散列是否与存储的密码匹配。

使用这些散列有一个轻微的缺点,即散列的大小是有限的,例如 MD5 散列是 128 位。这意味着 MD5 散列只有2^128340,282,366,920,938,463,463,374,607,431,768,211,456可能的组合。现在虽然这是一个很大的数字,但这意味着你可以有他们所谓的哈希冲突,其中你有两个不同的项目或键产生相同的哈希。从理论上讲,较大的按键尺寸,发生碰撞的概率较低的时间越长,应该采取蛮力密码,但被严格评估熵和多久CAN采取但也有可能他们尝试的第一个条目可能是匹配的条目,即使它是哈希冲突。一般来说,使用具有更大密钥大小的散列确实更安全,因为假设这是 MD5,第一个密码匹配出340,282,366,920,938,463,463,374,607,431,768,211,456可能的匹配项的几率是极不可能的。也挑好密码,因为很多饼干会尝试和使用单词列表,名称列表,这些列表的突变(即,如果这个词是“鱼”,那么他们将尝试fish1234fish!@#$等等),他们依靠暴力破解密码了。

您可以判断您的系统是否使用加密哈希来存储密码的方法是查看/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$意味着您正在使用河豚
  • $5$ 意味着您正在使用 SHA-256
  • $6$ 意味着您正在使用 SHA-512

SHA-512 是使用 glibc 提供的最佳可用散列。我不知道河豚有多强大,但它不是 glibc 的一部分,因此只能在添加了它的某些发行版中使用。SHA-512 在预期发生冲突之前生成 512 位密钥或 2^512 种可能的组合,并且使用足够复杂的密码,一组计算机需要很长时间才能找到实际密码或哈希中的冲突.

此外,如果您有一个不以开头的哈希,$num$那么您使用的是 DES,并且长度限制为 8 个字符。我相信使用 DES 或至少其中一些的旧系统,它们将采用任何大小的密码,但只使用前 8 个字符。这意味着如果您将密码设置为mybigbigapple并且有人使用该密码,mybigbigcity那么他们将被允许进入,因为 DES 只会使用mybigbig,之后的任何内容都将被丢弃。

所以你知道,2008 年 4 月发布的 Ubuntu 8.04 使用 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 很长一段时间(因为至少使用了 MD5 并且可能在此之前)允许实际密钥的字符指针。这意味着它接受的密钥长度的唯一限制是基于该程序可用的 RAM 量,但很可能,这可能远远长于任何人能够记住的任何密码(数百万个字符?)。

这应该可以回答您关于密码可以有多长的问题。希望我有所帮助。

参考:

  • “SU 答案的最大长度是多少?” 大声笑很好的答案! (7认同)
  • 应该指出的是, crypt() 算法已被弃用十多年了。无论 crypt() 密码有多长,它都会被截断为 8 个字符。结合 12 位 salt 的非常小的密钥空间,crypt() 已经变得完全不安全。作为参考,这里有一篇文章介绍了 2010 年由于使用 crypt() 如何导致 100 万个 Gawker 密码被泄露:[https://www.lightbluetouchpaper.org/2010/12/15/the-gawker-hack -how-a-million-passwords-were-lost/](https://www.lightbluetouchpaper.org/2010/12/15/the-gawker-hack-how-a-million-passwords-were-lost/) (2认同)

Joh*_*kin 8

这取决于使用的身份验证模块。在现代 Linux 系统中,密码长度没有最大限制。一些过时的系统可能会受到其密码存储系统的限制——流行的最大值似乎是 8、40 和 255。