函数"/>
关于Linux中密码校验过程的部分函数
目录
1. 密码存储位置
2. 解析密码
3. 加密
4. 从终端读入一个指令
5.练习
1. 密码存储位置
/etc/shadow 普通用户没有读权限--》sudo
2. 解析密码
#include <shadow.h>struct spwd *getspnam(const char *name);
struct spwd {char *sp_namp; /* Login name 用户登录名 */char *sp_pwdp; /* Encrypted password 加密的密码 */long sp_lstchg; /* Date of last change(measured in days since1970-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 expiresto warn user to change it 在密码到期前几天警告用户更改密码*/long sp_inact; /* # of days after password expiresuntil account is disabled 密码过期后多少天账户被禁用*/long sp_expire; /* Date when account expires(measured in days since1970-01-01 00:00:00 +0000 (UTC)) 密码修改后的有效期*/unsigned long sp_flag; /* Reserved */
};
3. 加密
加密算法不可逆
#include <unistd.h>char *crypt(const char *key, const char *salt);
key : 要加密的密码
salt: 密钥(如果未提供 salt 参数,则每次调用该函数时会随机生成一个。)
返回使用 DES、Blowfish 或 MD5 加密的字符串
(1)salt这个字符串如果以$1$开头,以$结尾,那么这表示让crypt用MD5的方式加密,加密后出来的密文格式就是 $1$...$<密文正文> ,夹在$1$和$之间的字符串就是我们指定的密钥文字。这个密钥文字最多不能超过8个字符。
(2)如果salt字符串不是(1)方式的格式,那默认就用DES加密方法。DES加密时,salt只能取两个字符,也就是说,salt最多不能 超过2个字符,多出的字符会被丢弃,用DES加密出来的密文前两个字符就是密钥。后面紧跟着的就是真正的密文。
4. 从终端读入一个指令
#include <unistd.h>char *getpass(const char *prompt);
getpass()函数用于从终端输入一行字符串,关闭了回显(输入时不显示输入的字符串),适用于用密码的输入。具体可参照 getpass函数用法
参数prompt为提示字符串地址。
返回输入字符串的地址
5.练习
#define _XOPEN_SOURCE /* See feature_test_macros(7) */
#include <unistd.h>
#include <shadow.h>
#include <stdio.h>
#include <string.h>/*演示linux密码校验过程用户名:argv[1]*/int main(int argc, char *argv[])
{char *pwdStr;struct spwd *sp;char *cryStr;if (argc < 2)return 1;// 读入密码pwdStr = getpass("密码:");// 加密// saltsp = getspnam(argv[1]); // /etc/shadowif (NULL == sp) {perror("getspnam()");return 1;}cryStr = crypt(pwdStr, sp->sp_pwdp);if (strcmp(sp->sp_pwdp, cryStr) == 0)printf("密码正确\n");elseprintf("鉴定错误\n");return 0;
}
更多推荐
关于Linux中密码校验过程的部分函数
发布评论