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

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

对于 PAM 您只须要作:linux

  • 对您的密码采用不一样于 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文件,这个前提条件貌似很难。
本文只是篇技术分析文章,没有其它任何初衷。code

相关文章
相关标签/搜索