原文连接: https://voidint.github.io/pos...php
如何生成一个Linux用户登陆密码?可能有人会说用passwd
生成。的确,passwd命令可以帮助咱们重置用户登陆密码,可是这并无解答如何生成一个Linux用户登陆密码
的疑问。html
对于这个问题,秉承着实用主义的精神,我本来也不会去深究。毕竟,安装的时候会设置密码,安装完毕后能经过passwd
命令重置密码,学会这两点后已知足通常的需求已经绰绰有余了。linux
可是,对于自动化而言,知道以上的两点是不够的。Linux的自动化安装过程当中,设置用户登陆密码这事,确定不能有人为干预,不然谈什么自动化。操做系统安装完毕后,也有可能会有重置用户密码的自动化需求,此时使用passwd
命令来重置用户密码,也不见得是最佳的选择。git
若是明白了密码的生成机制,那么这个自动化需求的难题也就迎刃而解了。github
有Linux基础的人必定知道,Linux的用户登陆密码信息是存放在/etc/shadow
文件当中的,而且该文件只有root
用户可以访问。如下会以voidint
这个用户为例,看一下这个用户的密码信息。算法
$ sudo cat /etc/shadow | grep voidint [sudo] password for voidint: voidint:$6$3kheX/Vg$TGum9JEjfmGsj8Mfk3SUY/d/bWkJgnRimCxoaDTX7wcgrraYvU.fiziEUdpDglWc58uPZqWJhKNjiXayP9Q6b0:16892::::::
很明显,这个字符串被:
符号分隔成了9段。咱们这里只关注前两段,至于每一段具体的含义,能够戳这里自行阅读。第一段,是用户名称。第二段,即为用户密码。其实密码
这种称呼并不许确。相对准确的说法是,用户密码明文通过某种哈希算法计算所得到的密文。可是,鉴于这个相对准确的说法实在太长太拗口,不便于表达。所以,如下提到的密码
在无特别说明状况下,一概指的是密码明文的密文。docker
言归正传,看到这里相信好多人会和我有同样的思考: 是否是只要知道了密码生成的算法,并按照此算法生成一个知足Linux要求的密码,再把密码覆盖这个第二段的内容,那么用户密码就被重置了吗?shell
仔细看这段密码,会发现它是由$xxx$xxx$xxx
的格式构成,即由$
符号分隔的3端字符串构成。查阅资料后得知,这个格式能够进一步归纳为$id$salt$encrypted
。简要说明下$id$salt$encrypted
中各个部分的含义:centos
id
: 加密(确切说是哈希)所用算法的代号。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) |
salt
: 由程序随机生成的字符串,即盐)。encrypted
: 用户密码明文字符串加盐后使用哈希算法所得的哈希值,即哈希(明文+盐)
。特别说明工具
资料中还提到了另一种形式的密码——$id$rounds=yyy$salt$encrypted
。其中,盐的部分换成了rounds=yyy
。yyy
是一个由用户(调用方)提供的[1000, 999999999]
之间的整数。
知道了上面这部分基础知识,那么接下来就是理论指导实践
的环节了。具体能够借助什么工具来生成密码呢?这里使用的grub-crypt
工具。你能够在某个Linux发行版中安装这个工具,也可使用我提供的这个dockerfile。
$ grub-crypt --sha-512 Password: Retype password: $6$r1jcut3Crl8bSIMo$XfKnrl4Ykzk2KPQ59MCXcUef9OjZWoZrIp7aeWwnCzIVQY1p/G1EiJQE4DYFej783NlvR5KtKYXs4P/hQaVst.
/etc/shadow
文件中(该文件只有root用户才有权限读写,若root也无权限,则赋予600
权限便可)$ sudo cat /etc/shadow | grep voidint voidint:$6$r1jcut3Crl8bSIMo$XfKnrl4Ykzk2KPQ59MCXcUef9OjZWoZrIp7aeWwnCzIVQY1p/G1EiJQE4DYFej783NlvR5KtKYXs4P/hQaVst.:16892::::::