RHCSA&RHCE(RHCE7)学习深入--shadow密码的加密方式

 

1) 查看shadow文件的内容

cat /etc/shadow

root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.:14838:0:99999:7:::

其格式为:

{用户名}{加密后的口令密码}{口令最后修改时间距原点(1970-1-1)的天数}{口令最小修改间隔(防止修改口令,如果时限未到,将恢复至旧口令){口令最大修改间隔}{口令失效前的警告天数}{账户不活动天数}{账号失效天数}{保留}

【注】:shadow文件为可读文件,普通用户没有读写权限,超级用户拥有读写权限。如果密码字符串为*,则表示系统用户不能被登入;如果字符串为!,则表示用户名被禁用;如果字符串为空,则表示没有密码。

我们可以使用passwd d 用户名 清空一个用户的口令密码。

2) 解析shadow文件中密码字符串的内容

对于示例的密码域$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.,我们参考了linux标准源文件passwd.c,在其中的pw_encrypt函数中找到了加密方法。

我们发现所谓的加密算法,其实就是用明文密码和一个叫salt的东西通过函数crypt()完成加密。

而所谓的密码域密文也是由三部分组成的,即:$id$salt$encrypted

【注】: 

id1时,采用md5进行加密;

id5时,采用SHA256进行加密;

id6时,采用SHA512进行加密。

3) 加密参数salt的由来

在我们的示例密码域中saltBg1H/4mz,那么它又是如何来的?

我们还是从标准源文件passwd.c中查找答案。在passwd.c中,我们找到了与salt相关的函数crypt_make_salt

在函数crypt_make_salt中出现了很多的判断条件来选择以何种方式加密(通过id值来判断),但其中对我们最重要的一条语句是gensalt(salt_len)

我们继续查看了函数static char *gensalt (unsigned int salt_size),才发现原来神秘无比的salt参数只是某个固定长度的随机字符串而已。

4) 最终结论

在我们每次改写密码时,都会随机生成一个这样的salt。我们登录时输入的明文密码经过上述的演化后与shadow里的密码域进行字符串比较,以此来判断是否允许用户登录。

5) 手工生成shadow密码

使用pythoncrypt模块:

# python -c 'import crypt;pw="123456";salt="$6$Ev74UfEC$";print(crypt.crypt(pw,salt))'

$6$Ev74UfEC$cml/xwJiYhL9MAN8sLdbQXZLmdjJ3zDb0NCMfVJILsEJO9AQPQNdH.CY9L550/9nwHyqQY3zZIVxTfARUN6NQ.

# echo “123456” | passwd --stdin gly

# grep gly /etc/shadow

gly:$6$Ev74UfEC$cml/xwJiYhL9MAN8sLdbQXZLmdjJ3zDb0NCMfVJILsEJO9AQPQNdH.CY9L550/9nwHyqQY3zZIVxTfARUN6NQ.:17915:0:99999:7:::

猜你喜欢

转载自blog.csdn.net/byrgzs/article/details/86551541