如何让用户密码在 Linux 中以明文形式显示?

use*_*050 30 password

我们知道用户的密码保存在 中/etc/passwd,但是以加密方式保存的,所以即使是 root 也看不到它们:

jane:x:501:501::/home/jane:/bin/bash
fred:x:502:502::/home/fred:/bin/bash
Run Code Online (Sandbox Code Playgroud)

如上图,:x:代表密码。

有没有办法(可能的配置)以/etc/passwd明文形式保存密码,以便 root 可以看到它们?

der*_*ert 60

其他两个答案告诉你——正确!——这是一个坏主意™。但是他们也告诉过你这很难做到,需要更改一堆程序。

这不是真的。这很容易。您只需要更改一两个配置文件。我觉得指出这一点很重要,因为您在登录不受控制的系统时应该意识到这一点。这些实际上不会将纯文本密码放入/etc/passwdor 中/etc/shadow,它会进入不同的文件。注意我没有测试过这些,因为我宁愿没有纯文本的密码。

  1. 编辑/etc/pam.d/common-password(捕捉密码更改)或/etc/pam.d/common-auth(捕捉登录)并添加… pam_exec expose_authtok log=/root/passwords /bin/cat

  2. 编辑这两个,然后从 pam_unix 切换到 pam_userdb crypt=none。或者,您可以只将它放在 common-password(也离开 pam_unix)中,以便在更改密码时只记录密码。

  3. 您可以shadow从 pam_unix 中删除(以及任何强哈希选项)选项以禁用影子文件,并返回到传统的 crypt 密码。不是纯文本,但开膛手约翰会为您解决这个问题。

有关更多详细信息,请查看PAM 系统管理指南

您还可以编辑 PAM 的源代码,或编写自己的模块。您只需要编译 PAM(或您的模块),别无他物。

  • @erik 选择他/她认为最有帮助的答案作为接受的答案是提问者的特权。OP 发现“不要那样做”可能是件好事!最有帮助的……另外,需要明确的是,这不是在受感染或恶意管理的系统上窃取密码的唯一方法。因此,您不能仅查看 PAM 配置来确定您是否安全。 (8认同)
  • 这是假设发行版正在使用 PAM,但并非所有人都这样做。 (3认同)

Bob*_*bby 36

哦,亲爱的,好吧,让我们从头开始……

我们知道用户的密码保存在 /etc/passwd 中,但是是以加密的方式

不,它们已经存储在 中/etc/passwd,那是很久以前的事了。如今,大多数情况下,密码都存储在所谓的影子文件中/etc/shadow

但是以加密的方式,所以即使是 root 也看不到它们:

我知道它有时可以互换使用,但散列不是加密。加密就其定义而言是可逆的,这意味着您可以将加密的内容转换回其明文形式。散列被设计成以任何方式都不可逆(除了蛮力)。散列的原始明文形式不应该是可恢复的。

影子文件中的密码以散列形式存储。

如上图:x:代表密码

x这种情况下仅适用于传统密码字段的占位符。这x意味着可以在影子文件中找到密码。

有没有办法(可能的配置)以明文形式将密码保存在 /etc/passwd 中,以便 root 可以看到它们?

是的,这确实是可能的,但由于某些原因,这不是一个好主意。Derobert 的回答解释了一种相当简单的方法

但为什么这不是一个好主意呢?嗯,有一个简单但非常重要的原因:安全。我建议阅读以下问题:

但总而言之,假设如下: 公司中有一台服务器,所有用户帐户都由其密码保护,并且这些用户帐户中的数据使用相同的密码进行加密。来自外部的破解者可以访问服务器,但他们无法访问任何重要数据,因为这些数据仍然在用户帐户中加密。

现在假设密码将以纯文本形式存储。破解者将突然可以访问所有内容,因为可以读取密码。但是,如果将它们存储为散列值,那么除了拥有大量资源进行蛮力攻击的人之外,它们几乎对任何人都无用。

  • @erik 有时,问题的正确答案是“不要这样做”,即使这在技术上是可行的。这是其中之一。 (6认同)
  • 在 OP 关于加密和散列的辩护中,glibc 的 [crypt 手册页](http://man7.org/linux/man-pages/man3/crypt.3.html#NOTES) 说:«如果 salt 是字符串以字符 `"$id$"` 开头,后跟以 `"$"` 结尾的字符串:`$id$salt$encrypted` 然后不使用 DES 机器,`id` 标识使用的 *encryption* 方法和这将决定如何解释字符串的其余部分»。 (2认同)
  • @Bobby 这是一个很好的回答,但不是一个很好的答案。为了使它成为一个很好的答案,你应该改变它“不容易实现”的部分,因为它显然是,如 derobert 的答案所示。 (2认同)

Ant*_*hon 10

首先,加密的密码不在 中/etc/passwd,但在/etc/shadow. 这样做的原因之一是它/etc/passwd是公开可读的(例如,您可以找到另一个用户的 GECOS 字段信息),并且,尤其是对于较旧的加密方案,可能允许对加密密码进行暴力攻击。

仅以纯文本形式存储密码不是必需的,并且需要更新密码程序和读取/etc/shadow信息的库以检查有效密码。然后您必须希望所有实用程序都使用共享库来访问该信息,而不是静态链接到无法理解纯文本密码存储的内容。

如果这是设置配置中的一个选项,那么总会有愚蠢的人会不恰当地打开它。当他们仍在 CRT 屏幕上工作并以一种可以从建筑物外轻松获取的方式进行广播时,他们正在查看信息。

除此之外,人们倾向于在多个系统上使用相同或相似的密码,因此将任何密码设为人类可读都不是一个好主意。由于某些系统管理员可以在其他系统上重试他们的系统,他知道用户有一个帐户。

一定有更多有趣的事情,可以在您的系统上调查其工作原理。

  • `/etc/shadow` 不存储加密密码,它存储密码哈希。是的,这个函数叫做`crypt`,手册页说“加密”,但是如果你把一条鱼叫做自行车,那它就没有轮子了。请注意,无需重新编译任何程序(至少在 Linux 和 Solaris 上),可以让 `/etc/shadow` 以不同的格式存储密码:身份验证方法始终是动态链接的。将密码存储为纯文本将是一个 [可怕的想法](http://unix.stackexchange.com/a/145494) 但 [通过一些工作是可能的](http://unix.stackexchange.com/a/ 145500)。 (3认同)