Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1738900
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

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

唯一两个强制的域是用户登录名和加密密码。其它的域控制了密码多久改变一次--被熟知为“密码年龄(password aging)”--以及一个帐号被允许存在多久。

影子密码文件不应该被所有人读。只有很少的程序需要访问加密密码--例如login和passwd--而这些程序通常是设置用户ID的根用户。有了影子密码、普通密码文件/etc/passwd可以被所有人读。


在Linux2.4.22和Solaris 9,一个独立的函数休可能用来访问影子密码文件,与访问密码文件的函数集相似。



  1. #include <shadow.h>

  2. struct spwd *getspnam(const char *name);

  3. struct spwd *getspent(void);

  4. 两者成功时都返回指针,否则返回NULL。

  5. void setspent(void);

  6. void endspent(void);



在FreeBSD 5.2.1和Mac OS X 10.3,没有影子密码结构体。额外的帐号信息被存储在密码文件里。

阅读(671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~