一探 Linix 用户口令加密

最近在看 Violent Python ,第一个程序就是 UNIX口令破解机 ,第一个程序的最后书上写道基于*Nix的现代操作系统中, /etc/shadow 文件中存储了口令的 bash,并能使用更多安全的 bash算法。下面的例子使用的是 SHA-512 hash 算法。SHA-512 函数可以在 Python 的 hashlib 库中找到

1
2
root:~# cat /etc/shadow | grep root
root:$6$vsqruFDy$pwB6ig728AFmqx36D9fbqUpsNmJwK/SnqyIOfKy6uGJ8v77qZmmIyWQYvABUrjcJO6tEw86UGyWlq/2LSR5vF.:15503:0:99999:7:::

然后就开始了升级脚本之路。

首先看看 shadow 文件怎么看:

看了许多文档,shadow文件 简单来说就是 {用户名}:{加密后的口令}:{口令最后修改时间距原点(1970-1-1)的天数}:{密码不可被变更的天数,设置了这个值,则表示从变更密码的日期算起,多少天内无法再次修改密码,如果是0的话,则没有限制}:{口令最大修改间隔}:{口令失效前的警告天数}:{账户不活动天数}:{账号失效天数}:{保留}
其中加密后的口令又分为 $id$salt$encrypted,然后 id 对应的加密算法就是:
|ID|算法|
|:—:|:—:|
|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)|

再看上面的例子,root:$6$vsqruFDy$pwB6ig728AFmqx36D9fbqUpsNmJwK/SnqyIOfKy6uGJ8v77qZmmIyWQYvABUrjcJO6tEw86UGyWlq/2LSR5vF.:17301:0:99999:7:::,root 为用户名;6为加密算法 ID,即 SHA-512;vsqruFDy为 salt;pwB6ig728AFmqx36D9fbqUpsNmJwK/SnqyIOfKy6uGJ8v77qZmmIyWQYvABUrjcJO6tEw86UGyWlq/2LSR5vF. 为加密后的字符串;口令最后修改时间距原点(1970-1-1)的天数为15503天;随时可以修改密码;口令最大修改间隔99999;口令失效前的警告天数7;账户不活动天数与账号失效天数和保留部分均为空。

然后看看 hashlib 怎么用:

import hashlib

help(hashlib)

打开文档,可以看到文档中给出了例子。

直接hashlib.sha512("PASSWORD").hexdigest()就可以得到 SHA-512 的结果,但是我还有 salt 值,看到文档下面还有一个例子:

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)

pbkdf2_hmac 第一个参数代表加密算法,第二个参数是密码,第三个参数是salt,第四个是迭代次数,还有一个缺省参数没有写。但是–,得出的结果也不会有 / 呀。各种

坚持原创技术分享,您的支持将鼓励我继续创作!