分类: 系统运维
2012-03-29 12:26:44
加密密码是通过一个单向加密算法的用户密码的一个拷贝。因为这个算法是单向的,我们不能从加密的版本猜测原始密码。
历史上,这个使用的算法一直生成13个可打印的64字符集[a-zA-Z0-9./]中的字符。一些更新的系统使用一个MD5算法来加密密码,为每个密码
生成31个字符。(使用越多字符存储加密密码,会有越多的组合方式,这样通过尝试所有可能的变体来猜测密码会更难。)当我们在加密密码域里放入单一字符
时,我们保证一个加密密码绝不会匹配这个值。
给定一个加密密码,我们不能应用一个把它回转并返回普通文本密码的一算法。(普通文本密码是我们在Password:提示里输入的东西。)然而我们可以猜
一个密码,通过一个单向算法加密它,然后把结果与加密密码比较。如果用户密码被随机选择,这种暴力方式不会太成功。然而,用户倾向于选择一些非随机密码,
比如配偶的名字,街道名或宠物名。一些人得到密码文件拷贝的一个普遍经历就是尝试猜测这些密码。
为了更难获取裸材料(加密好的密码),系统现在把加密密码存在另一个文件里,通常被称为影子密码文件。这个文件最少必须包含用户名和加密密码。其它密码相关的信息同样也存在这里。看下表:
文件/etc/shadow的域 | |
描述 | 结构体spwd成员 |
用户登录名 | char *sp_namp |
加密密码 | char *sp_pwdp |
最后修改密码的自Epoch的天数 | int sp_lstchg |
直到改变允许的天数 | int sp_min |
需要改变之前的天数 | int sp_max |
警告密码到期的天数 | int sp_warn |
帐号失效前的天数 | int sp_inact |
帐号过期的自Epoch距今的天数 | int sp_expire |
保留 | unsigned int sp_flag |
影子密码文件不应该被所有人读。只有很少的程序需要访问加密密码--例如login和passwd--而这些程序通常是设置用户ID的根用户。有了影子密码、普通密码文件/etc/passwd可以被所有人读。
在Linux2.4.22和Solaris 9,一个独立的函数休可能用来访问影子密码文件,与访问密码文件的函数集相似。
在FreeBSD 5.2.1和Mac OS X 10.3,没有影子密码结构体。额外的帐号信息被存储在密码文件里。