4.2.2 我怎样通过用户号得到阴影口令文件中的口令?
-----------------------------------------------
我的系统使用一组getsp*函数获得重要用户信息的. 然而, 我没有****getspuid()',
只有****getspnam()'. 我怎样做才能通过用户号获得用户信息呢?
变通方法是相对非常容易的。下面的函数可以直接放入你个人的应用函数库:
#include <stdlib.h>;
#include <stdio.h>;
#include <pwd.h>;
#include <shadow.h>;
struct spwd *getspuid(uid_t pw_uid)
{
struct spwd *shadow;
struct passwd *ppasswd;
if( ((ppasswd = getpwuid(pw_uid)) == NULL)
|| ((shadow = getspnam(ppasswd->;pw_name)) == NULL))
return NULL;
return shadow;
}
现在的问题是, 有些系统在阴影文件中并不保存用户号(uid)以及其它的信息。
4.2.3 我怎样核对一个用户的口令?
-------------------------------
一个基本的问题是, 存在各种各样的认证系统, 所以口令也就并不总是象它们看上去
那样。 在传统的系统中, 使用UNIX风格的加密算法,加密算法是不同的,有些系统使
用DES(译者注:DES:Data Encryption Standard,为NIST[National Institute of
Standard and Technology]确认的标准加密算法,最新消息表明,NIST将采用一种新
的加密标准Rijndael逐步取代DES)算法,其它的系统, 如FreeBSD国际版使用MD5(译者
注:MD5是当今最为广泛使用的单项散列算法,由Ron Rivest发明,详细资料参见RFC 1321
http://www.faqs.org/rfcs/rfc1321.html)算法。
最常用的方法是使用一种单项加密算法(译者注:即单项散列[Hash]算法)。输入的
明文口令被加密,然后与文件中存放的加密口令比较。怎样加密的详细信息可以
查看****crypt()'的手册页, 这里有一个通常做法的版本:
/* 输入明文口令和加密口令, 检查是否匹配,
* 成功返回 1, 其它情况返回 0。
*/
int check_pass(const char *plainpw, const char *cryptpw)
{
return strcmp(crypt(plainpw,cryptpw), cryptpw) == 0;
}
这个函数之所以能工作是因为加密函数使用的添加(salt)字串存放在加密口令字串的前部。
*警告:* 在一些系统中, 口令加密是使用一种‘crypt()’的变体,即‘bigcrypt()’函数。
5. 编程杂技
***********
5.1 我怎样使用通配字符比较字符串?
==================================
对于它的回答依赖于你所谓‘通配字符’一词的确切含义。
有两种很不相同的概念被认定为‘通配字符’。它们是:
*文件名通配模式*(filename patterns)
这是shell用来进行文件名匹配替换的(expansion)(或称为‘globbing’)
*正则表达式*
这是供编辑器用的,比如‘grep’,等等。它是用来匹配正文,而它们正常
情况下不应用于文件名。
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 常见 编程 if 一个 amp 程序 进程 函数 使用 NULL 文件 |
注册
个人空间
