linux的PAM认证和shadow文件中密码的加密方式

它是一种统一的认证方案。PAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法。具体见 PAM 网站

对于 PAM 您只需要做:

  • 对您的密码采用不同于 DES 的加密方式(让它们面对暴力解码(brute-force decode)时更为坚固)。

  • 对您所有用户使用资源限额,以防止他们进行拒绝服务(denial-of-service)攻击(进程数、占用内存量等等)。

  • 随时启用 shadow password (见下文)

  • 只在特定的时间允许特定的用户从特定的地方登录

上述介绍来源于http://man.ddvip.com/linux/Mandrakelinux10server/password-security.html

========================================


我们看看shadow文件的格式:

格式是:

shadow是个可读文件,普通用户没有读写权限,超级用户权限为可读写。

如果密码字符串为,表示系统用户不能被登入,为表示用户名被禁用,如果密码字符串为空,表示没有密码,通过可以清空一个用户的口令。

具体shadow可参考shadow how-to,尽管这是一份已经过时了的文档。

下面探讨下shadow中的密码加密问题:

还是以上面的root用户为例:

其中的密码域为 ,参考linux标准的passwd.c源文件,在pw_encrypt函数中可以找到加密方法:


也就是说加密用明文密码和一个叫salt的东西用crypt()加密生成密文。
再来看看crypt的帮助:
http://www.kernel.org/doc/man-pages/online/pages/man3/crypt.3.html
可发现原来crypt密文里是由三部分组成的,即:
目前常用的是当id为1时,使用md5加密,id为5,采用SHA256进行加密,id为6采用SHA512进行加密。
分析上面的函数,可看出我们的shadow密码中,直接把 当做salt参数带入进行crypt加密。
那好,我们可以写个简短的代码进行试验:

保存后执行gcc passwd.c -lcrypt -o passwd

编译成功后运行./passwd root 123
其中./passwd是生成的命令,root是我们用来测试的账户,123是测试系统中root用户的密码,执行的结果是:

可见,我们得到了和系统shadow文件下相同结果的密文。


根据我们的运行结果我们可以看到,在root用户的shadow中,他的salt是
我们之前也是用这个salt来进行加密匹配的。但是,问题是:这个salt到底是怎么来的??

还是分析标准的passwd.c,
在passwd.c中,找到了生成salt的函数:crypt_make_salt

除了一大段条件判断语句,其实最重要的只有一句gensalt(salt_len)。
看看gensalt的定义:

哦,原来神秘的salt只是某个的固定长度的随机的可见的字符串而已。
每次改写密码时,都会再随机生成一个这样的salt。而用户登入时,会拿用户登入的明文密码经过上述演示的步骤生成密文后和shadow里的密码域进行比较。


有了上述的分析,要暴利破解linux下的口令也不是什么问题,但前提是你有机会拿到shadow文件,这个前提条件貌似很难。
本文只是篇技术分析文章,没有其它任何初衷。