- 论坛徽章:
- 0
|
众所周知UNIX/Linux的密码文件原来采用/etc/passwd,共有7个字段。用户的密码加密后放在每一行的第二个字段里,这个
/etc/passwd文件在一般情况下是所有用户可读,只有root用户可写的,这样不良用户就可能读取加密后的密码字串来取得密码。因为这个安全原
因,设置一个/etc/shadow文件专门用于保存密码且它的权限一般是root可读,没有其他权限。这样加密后的密码文件就不能被普通用户读取。做法
是把/etc/passwd对应的密码字段用*号表示,在/etc/shadow里对应的一行,有用户名和真正的密码加密字串,其他的字段一般留空。
原始建立起来的系统,只有/etc/passwd文件,使用useradd,passwd命令也只能把密码写入/etc/passwd,这时有一个工具可用,叫pwconv,其实这是一个工具集,所有的工具如下:
pwconv 产生从/etc/passwd到/etc/shadow的转变
pwunconv 产生从/etc/shadow到/etc/passwd的转变
grpconv 产生从/etc/group到/etc/gshadow的转变
grpunconv 产生从/etc/gshadow到/etc/group的转变
现在说一下加密字段,加密字段保存的加密后字符串,它是由crypt函数产生的,这个函数现在提供两种算法:MD5和DES,crypt的原型如下:
#define _XOPEN_SOURCE
#include
char *crypt(const char *key, const char *salt);
以上是man手册中查到的,但我在写程序时发现,编译还会发现警告,查找头文件后发现,应该定义的宏不是_XOPEN_SOURCE而是__USE_XOPEN,或许在其他的UNIX中应该是定义_XOPEN_SOURCE,但Linux不是。
其中的key是指真正的明文密码了,salt参数是用于扰乱用的辅助加密的字串。因为采用的是两种算法,所以salt有两种选择:
MD5: salt应该是以"$1$"三个字符开头,后跟8个字符,这8个字符应在字符集[a-zA-Z0-9./]中选择,最后一个字符$是可选的,可加可不加,这样整个salt就会是11个或12个字符了。
DES: salt由两个字符组成,这2个字符也应在[a-zA-Z0-9./]中选择。
crypt函数就是根据salt的不同来选择不同的算法。这两种算法有什么区别呢?第一产生的加密字串不同:MD5的结果是把12个字符(如果传递的
salt没有以$结尾,crypt会自动加上)在开始,后跟加密的字串。而DES会把salt的两个字符加在首部,然后加上11个加密后的字串共13个。
这些结果就是放在/etc/passwd或是在/etc/shadow里第二个字段的加密字串了。同时把salt也放进去,是为了验证时把salt取出来
与用户键入的密码再加密一次把结果再和密码文件里的加密字串比较一下,以判定是否是正确的密码。
现在一般使用MD5加密算法,Linux就是这样做的。这样比DES较安全。
而以前的传统的UNIX使用DES算法。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/2949/showart_67233.html |
|