我尝试了几种在 SL 6.5 上生成加密密码的方法,但似乎都不起作用。我在各种 /var/log/anaconda* 文件中没有发现任何错误,但我无法登录,所以显然它不起作用。
我用作模板的原始自动创建文件/root/anaconda-ks.cfg
如下所示:
rootpw --iscrypted $6$...(about 100 characters)
authconfig --enableshadow --passalgo=sha512
接下来我尝试了一下openssl passwd -1
,得到了:
rootpw --iscrypted $1$...(about 30 characters)
authconfig --enableshadow --passalgo=sha512
我意识到这不是 SHA-512,所以我尝试了我发现 Python 单行代码在几个地方重复出现:
rootpw --iscrypted $6...(about 10 characters)
authconfig --enableshadow --passalgo=sha512
什么都不起作用;我无法登录,最终不得不在单用户模式下重置 root 密码。
答案1
确保您的机器上有 shadow 和 passalgo=sha512,将 root 密码设置为您在该机器上想要的任何密码,然后从 /etc/shadow 中获取它并将其放入 kickstart 中。这对于生产用途来说是不可取的。
要以编程方式执行此操作,请使用所选语言的 crypt 库来生成 kickstart 文件:
红宝石:
'password'.crypt('$6$' + (Base64.encode64(6.times.map{ Random.rand(256).chr }.join)).strip)
PHP的:
crypt ('password', '$6$' . base64_encode (openssl_random_pseudo_bytes(6)));
Perl:
crypt ('password', '$6$' . encode_base64 (join '' => map chr (rand (256)), 0..5))
Python:
crypt.crypt('password', '$6$' + base64.b64encode(os.urandom(6)))
强烈建议您每次都使用随机盐,就像我在这里所做的那样,特别是如果您在所有服务器上都使用相同的密码。
编辑: Python 3:
crypt.crypt("password", crypt.mksalt())
将对 的调用替换os.random
为特定于加密的mksalt
。
看Python 标准库:crypt: crypt.mksalt()
: “返回指定方法的随机生成的盐。如果没有给出方法,则使用 methods() 返回的最强方法”
编辑:
1) '$6$' 代表 SHA512。您需要将其替换为您选择的加密类型。
2)您也可以将其中任何一个转换成一行程序,以便从 bash 中执行此操作。
3) BSD crypt 与 GNU crypt 的实现不同,因此它们不兼容。如果您想在 BSD 系统(如 OSX)上使用它,您可以使用 PHP(PHP 版本 > 5.3.0)版本,因为它实现了自己的crypt()功能。
在 Mac 上,另一种方法是使用密码库:
python -c 'import getpass; import passlib.hash; h=passlib.hash.sha512_crypt.hash(getpass.getpass()); print(h if (passlib.hash.sha512_crypt.verify(getpass.getpass("Confirm:"), h)) else "")'
或者,使用 glibc 的默认轮数(5000):
python -c 'import getpass; import passlib.hash; h=passlib.hash.sha512_crypt.using(rounds=5000).hash(getpass.getpass()); print(h if (passlib.hash.sha512_crypt.verify(getpass.getpass("Confirm:"), h)) else "")'
答案2
哈希密码的生成方式已记录这里。
$ python -c 'import crypt; print(crypt.crypt("My Password", "$6$My salt"))'
它对你不起作用的原因是你使用 Mac 来生成哈希。crypt
实现方式与 GNU/Linux 不同。
来自crypt(3)
手册页:
Glibc notes
The glibc2 version of this function supports additional encryption
algorithms.
If salt is a character string starting with the characters "$id$" fol-
lowed by a string terminated by "$":
$id$salt$encrypted
then instead of using the DES machine, id identifies the encryption
method used and this then determines how the rest of the password
string is interpreted. The following values of id are supported:
ID | Method
---------------------------------------------------------
1 | MD5
2a | Blowfish (not in mainline glibc; added in some
| Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
So $5$salt$encrypted is an SHA-256 encoded password and
$6$salt$encrypted is an SHA-512 encoded one.
"salt" stands for the up to 16 characters following "$id$" in the salt.
The encrypted part of the password string is the actual computed pass-
word. The size of this string is fixed:
MD5 | 22 characters
SHA-256 | 43 characters
SHA-512 | 86 characters
The characters in "salt" and "encrypted" are drawn from the set
[a-zA-Z0-9./]. In the MD5 and SHA implementations the entire key is
significant (instead of only the first 8 bytes in DES).
扩展$id$
不存在OSXcrypt
对于 SHA512,您需要在 GNU/Linux 机器中生成哈希。
答案3
新的文档位置,可找到有关为 kickstart 选项生成散列密码的更多信息--iscrypted
::
http://pykickstart.readthedocs.io/en/latest/kickstart-docs.html#rootpw
python -c 'import crypt; print(crypt.crypt("My Password", "$6$My Salt"))
这将使用您提供的盐生成密码的 sha512 加密。
答案4
上面的 Python 示例是不完整的:
crypt.crypt('password', '$6$' + base64.b64encode(os.urandom(6)))
一个可行的单行代码如下:
python -c 'import crypt,base64,os; print(crypt.crypt("password", "$6$" + base64.b64encode(os.urandom(6))))'
在 Python 3 下
python -c 'import crypt; print(crypt.crypt("password", crypt.mksalt()))'