Answers:
从一开始,Unix和Unix风格的操作系统(包括Linux)始终将密码存储为加密散列(1)。这些哈希值最初存储在中/etc/passwd,但是该文件必须是世界范围内可读的,以使信息可用于其他目的-甚至是简单的ls -l读取操作/etc/passwd,都需要将每个文件所有者的数字用户ID转换为其显示的用户名。但是,将哈希密码保存在世界可读的文件中,使恶意用户可以轻松获取这些哈希值,并尝试为其他用户的帐户生成可用的密码(2)。
为了避免这种情况,最终将散列密码移入了一个只能由root(有时是特权管理员组)读取的文件/etc/shadow。这对系统的普通用户隐藏了哈希,同时保留了哈希以用于用户身份验证。
注意事项:
我知道Pedantic,但是存储的密码未加密。使用加密安全的哈希算法(至少在编写时是这样)对它们进行哈希处理。这里相关的主要区别是散列是固定长度的(加密文本的长度根据加密的文本的长度而变化)和不可逆的(加密的文本可以解密;散列的文本不能)。
由于哈希值是固定长度的,因此有无数的输入将与任何给定的哈希表示形式匹配。因此,攻击者可能会找到一个不一定与所有者用户密码相同的有效密码-尽管鉴于现代加密哈希的大小,这不太可能。
该/etc/shadow文件是出于安全原因而创建的,并包含每个用户的加密密码。
最初,加密的密码存储在中/etc/passwd。 /etc/passwd必须是全球可读的,以便系统可以将用户ID映射到用户名,以便用户可以找到彼此的信息,例如,其他用户的主目录或他们的电话号码,这些信息通常存储在“ gecos”字段中并由“ finger”实用程序显示。
但是后来人们意识到这是一个安全问题。任何有足够时间的人都可以通过以编程方式为每个可能的密码生成加密密码,来进行所谓的蛮力攻击。如果攻击者没有真正尝试通过telnet或登录ssh,那系统将无法得知它正在受到攻击。
因此,加密的密码被移到了新创建的密码中/etc/shadow,该密码只能由root用户读取。
它还包含/etc/passwd文件不支持的与用户帐户和密码相关的其他信息,例如,密码上次更改的时间以及密码何时过期。
有关文件格式的完整详细信息,请参见man 5 shadow(网络版本)。
在不知道您正在处理哪个版本的SUSE的情况下,我不能说它是否与SUSE相同。例如,您的SUSE系统可能使用河豚而不是MD5。
您还暗示您正在将/etc/shadow文件与运行其他Linux发行版的系统混合,但没有说明其他发行版是什么。
例如,请参阅将影子文件从SuSE 9.3迁移到Ubuntu Server x86_64的问题。
要尝试找出答案,请打开/etc/shadow并查看加密的密码字段是否以$1$或开头$2$。如果包含$1$,则为MD5,并且与大多数其他发行版兼容。如果包含$2$,则根据Debian上的Blowfish阴影文件,它可能是Blowfish 。
如果您使用的是Ubuntu,则第一个针对Ubuntu河豚的Google搜索结果可能是一个很好的起点。
用户在/etc/passwd文件中列出。该文件包含系统使用的许多信息,不仅允许用户登录。
每行对应一个用户条目,不同的字段用冒号分隔。第一个是登录名,然后是相应的密码。
加密的密码曾经存储在此字段中。但是,该/etc/passwd文件必须对系统上的每个人都可读,因此加密不能防止暴力攻击,就像@Mikel所说的那样。解决方案是将这些加密的密码移动到仅root用户可读的文件中:/etc/shadow。
因此,/etc/shadow包含系统用户的加密密码。系统知道当密码字段中/etc/passwd仅包含x 时,它必须检查此文件中的密码(意思是“ 越过 / etc / shadow”)
/etc/passwd中的密码仍以与存储在中的密码完全相同的方式进行哈希处理/etc/shadow。您实际上并没有说输入的密码/etc/passwd是纯文本的,但是对于不熟悉* nix密码处理的人来说,很容易将您的答案误认为是暗含的。
x实际上没有任何意义。它在那里只是一个无效的哈希值(一个与任何密码都不匹配的哈希值)。一些系统使用!。
让我们看看我是否可以得到世界上所有的赞成票,因为我在87年写了后来的Linux Shadow Password Suite;)
原始/etc/passwd文件包含明文密码的基于DES的修改后的哈希。在crypt()创建函数时,据信(由UNIX操作系统的创建者说过),由于可能的密码数量和使用12位密码,对密码哈希进行攻击是不可行的(4,096个可能的值)“ salt”。每个可能的明文密码都有4,096个可能的哈希值,并具有64位的哈希结果,总共提供了2 ^ 72个可能的密码哈希。
就像另一幅海报所提到的,/etc/passwd各种实用程序还使用它在用户名和UID值之间映射(该/etc/group文件为组提供了类似的功能),并且要求它是世界可读的。
在1980年代,很明显,针对/etc/passwd文件中存储的密码哈希的字典攻击变得可行了,并且/etc/shadow在System V的早期版本中引入了AT&T UNIX。我记录了我用来编写原始Shadow库的手册页,从那时起就被遗忘了,但这绝对是System V的早期版本,可能是SVR3.2。
AT&T所做的事情以及我在87年最终在Linux上使用的SCO Xenix(原始的SCO Xenix,而不是后来的邪恶的SCO Xenix)实现的功能,只是将哈希密码移至/etc/shadow。这样可以防止偷渡式攻击,在这种情况下,没有特权的用户获取了副本/etc/passwd并对其进行了攻击。如果您熟悉为什么我首先写了Shadow,那么/etc/passwd在我们仍然使用UUCP处理几乎所有内容的日子里,我曾经让用户通过UUCP 下载文件。
到创建Linux并广泛使用Linux时,已经有大量用于攻击密码哈希的工具。高性能的重新实现crypt()是一种途径,而通过诸如Crack和libcrack之类的工具进行的基于字典的攻击则是另一种途径。最初的港口是由内特·霍洛威(Nate Holloway)和弗洛里亚·拉罗什(Floria La Roche)完成的(我赞扬了他们,我不知道是否有人在他们之前完成过工作)。
最终crypt(),即使在受保护的文件中,基于哈希的使用也不再安全,因此对原始MD5哈希进行了更改。MD5最终被认为太弱了,并使用了新的哈希值。
理论上,足够强大的哈希可以存储在中/etc/passwd。较差的操作安全性意味着许多系统/etc/shadow可以通过各种攻击媒介获得其文件-“我偷了备份文件”可能是最简单的。