关键是看到 password 属性值直接写入 /etc/shadow 文件。然后就是阅读 shadow 和 crypt 的手册页,并最终了解(希望)它们是如何组合在一起的。如果您对某些背景感兴趣,请参阅下面的血腥细节。
如果您对密码的 MD5 哈希表示满意,请使用 openssl 命令生成加密字符串。我使用的版本似乎不支持 SHA 算法。使用 openssl passwd --help 查看您可以使用哪些选项。
openssl passwd -1 -salt "yoursaltphrase"
Password: <enter the password>
$1$yoursalt$fIque2U6AZ.YRAqOu5Eyo/
现在在配方的 password 属性中使用该字符串:
user 'mytestuser' do
comment "Test User"
home "/home/mytestuser"
shell "/bin/bash"
supports :manage_home => true
password '$1$yoursalt$fIque2U6AZ.YRAqOu5Eyo/'
action :create
end
至于我,我最终手动创建了测试用户,然后从 /etc/shadow 复制了它的加密字符串作为配方的 password 属性值。
从 /etc/shadow 中,mytestuser: 之后的第二个字段是加密密码。
mytestuser:THIS_IS_THE_FIELD_YOU_WANT:16063:0:99999:7:::
参见man shadow和man crypt。
血腥细节
从手册页和各种用户论坛拼凑起来,这就是我学到的东西。请注意,这里的术语 encrypted 实际上表示 hashed,因为我不相信密码实际上可以被解密。
passwd 命令加密用户的纯文本密码并将其写入 /etc/shadow。
/etc/shadow 条目包含多种格式之一的用户名和加密密码。 “crypt”的手册页描述了这些格式,请参阅其注释部分。
加密值的格式为:
$id$salt$encrypted
把它想象成有两部分:盐和实际的加密密码。
盐部分由两部分组成:
- 可选的 id 前缀,用于标识所使用的加密算法,并以“$”作为前缀和后缀,例如“$id$”。
- 盐值,最多 16 个字符,以“$”结尾,例如“盐值$”。该值用于计算加密密码。它是一个随机字符串,每次生成密码时都不一样。
id可以是以下之一,表示使用的加密算法:
blank = DES (the default when no $id$ prefix is found)
1 = MD5
2a = Blowfish
5 = SHA-256
6 = SHA-512
加密密码长度根据加密算法固定:
DES = 8 characters
MD5 = 22 characters
SHA-256 = 43 characters
SHA-512 = 86 characters
Blowfish = ???
您可以使用 openssl passwd 命令生成各种密码哈希。
它支持选项:
-crypt DES-based standard Unix password algorithm (default)
-1 MD5-based password algorithm
-apr1 MD5-based password algorithm, Apache variant
-salt string use provided salt