6.3 阴影口令字(Shadow Passwords)
在上一节我们曾提及,对U N I X口令通常使用的加密算法是单向算法。给出一个密码口令,找不到一种算法可以将其反变换到普通文本口令(普通文本口令是在P a s s w o r d :提示后键入的口令)。但是可以对口令进行猜测,将猜测的口令经单向算法变换成加密形成,然后将其与用户的加密口令相比较。如果用户口令是随机选择的,那么这种方法并不是很有用。但是用户往往以非随机方式选择口令(配偶的姓名、街名、宠物名等)。一个经常重复的试验是先得到一份口令文件,然后用试探方法猜测口令。( G a r f i n k e l和S p a ff o r d〔1 9 9 1〕的第2章对U N I X口令及口令加密处理方案的历史情况及细节进行了说明。)
为使企图这样做的人难以获得原始资料(加密口令),某些系统将加密口令存放在另一个通常称为阴影口令( shadow password)的文件中。该文件至少要包含用户名和加密口令。与该口令相关的其他信息也可存放在该文件中。例如,具有阴影口令的系统经常要求用户在一定时间间隔后选择一个新口令。这被称之为口令时效,选择新口令的时间间隔长度经常也存放在阴影口令文件中。
/etc/shadow文件中的字段为:
struct spwd各个字段的详细意思为:
{
char *sp_namp; /* login name */
char *sp_pwdp; /* encrypted password */
sptime sp_lstchg; /* date of last change */
sptime sp_min; /* minimum number of days between changes */
sptime sp_max; /* maximum number of days between changes */
sptime sp_warn; /* number of days of warning before password expires */
sptime sp_inact; /* number of days after password expires until the account becomes unusable. */
sptime sp_expire; /* days since 1/1/70 until account expires*/
unsigned long sp_flag; /* reserved for future use */
};
1)“登录名”是与/etc/passwd文件中的登录名相一致的用户账号
2)“口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合{./0-9A-Za-z}中的字符,则对应的用户不能登录。
3)“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCOLinux中,这个时间起点是1970年1月1日。
4)“最小时间间隔”指的是两次修改口令之间所需的最小天数。
5)“最大时间间隔”指的是口令保持有效的最大天数。
6)“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
7)“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
8)“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了
9)保留字段
只有用户登录名和加密口令这两个字段是必需的。其他字段用于控制口令的改动频率(称为口令的衰老)以及账户保持活动状态的时间。
阴影口令字文件不应是一般用户可以读取的。仅有少数几个程序需要存取密码口令字文件,例如login(1)和passwd(1),这些程序常常是设置-用户-ID为root。有了阴影口令字后,普通口令字文件/etc/passwd可由各用户自由读取。
在Linux2.4.22和Solaris9中,与访问口令文件的一组函数类似,有另一组函数可用于访问阴影口令文件。
#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void); //return NULL if false
void setspent(void);
void endspent(void);
FreeBSD5.2.1和MAC OS X10.3中,没有阴影口令结构。