getpwnam()和getpwuid()
#include <sys/types.h>
#include <pwd.h>
struct passwd *getpwnam(const char *name);
struct passwd *getpwuid(uid_t uid);
//passwd结构体信息
struct passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
getpwnam():获取用户登录相关信息。返回一个指针,指向一个passwd结构体,其中包含用户名,密码,uid等信息。如果找不到匹配项或发生错误,则返回NULL。
getpwuid():用来搜索用户uid, 找到时便将该用户的数据以结构passwd结构返回。该结构包含密码数据库中与用户ID uid匹配的记录的字段。如果找不到匹配项或发生错误,则返回NULL。
getspnam()
很久以前,人们认为在密码文件中公开显示加密密码是安全的。当电脑越来越快,人们越来越有安全意识时,这就不再是可以接受的了。Julianne Frances Haugh实现了shadow密码套件,它将加密的密码保存在shadow密码数据库(例如,本地shadow密码文件/etc/shadow、NIS和LDAP)中,只有root用户才能读取。
#include <shadow.h>
struct spwd *getspnam(const char *name);
//spwd结构体信息
struct spwd {
char *sp_namp; /* Login name */
char *sp_pwdp; /* Encrypted password */
long sp_lstchg; /* Date of last change
(measured in days since
1970-01-01 00:00:00 +0000 (UTC)) */
long sp_min; /* Min # of days between changes */
long sp_max; /* Max # of days between changes */
long sp_warn; /* # of days before password expires
to warn user to change it */
long sp_inact; /* # of days after password expires
until account is disabled */
long sp_expire; /* Date when account expires
(measured in days since
1970-01-01 00:00:00 +0000 (UTC)) */
unsigned long sp_flag; /* Reserved */
};
函数的作用是:根据用户名获取该用户的shadow密码。返回一个指向spwd结构体的指针,该结构体包含shadow密码数据库中与用户名匹配的记录的字段。如果发生错误,则返回NULL。
crypt()
crypt()是密码加密函数。它没有相应的解密函数,使用的是一种单向算法
#include <unistd.h>
char *crypt(const char *key, const char *salt);
参数:
key:是用户键入的密码。
salt:可选项,如果未提供 salt 参数,则每次调用该函数时会随机生成一个,是从集合[a–z A–Z 0–9 ]中选择的两个字符的字符串。此字符串用于以4096种不同方式之一干扰算法。
返回值:成功返回指向加密密码的指针。出错返回NULL。