时间:2022-05-22来源:www.pcxitongcheng.com作者:电脑系统城
前言:
在linux中,用户和密码由/etc/passwd文件和/etc/shadow文件存储。
shadow是一个包含系统帐户密码信息和可选时间信息的文件。shadow文件每一行代表一条记录,每一条记录有9个字段,以下是每个字段的描述。
登录用户名:必须对应到/etc/passwd文件中的一条记录中的用户登录名
新建一个用户test,设置密码为test,然后查看其passwd记录以及shadow记录。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
└─$ sudo adduser --home /home/test --shell /bin/bash testAdding user `test' ...Adding new group `test' (1001) ...configuration error - unknown item 'NONEXISTENT' (notify administrator)configuration error - unknown item 'PREVENT_NO_AUTH' (notify administrator)Adding new user `test' (1001) with group `test' ...configuration error - unknown item 'NONEXISTENT' (notify administrator)configuration error - unknown item 'PREVENT_NO_AUTH' (notify administrator)Creating home directory `/home/test' ...Copying files from `/etc/skel' ...New password:Retype new password:passwd: password updated successfully |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
Changing the user information for testEnter the new value, or press ENTER for the defaultFull Name []:Room Number []:Work Phone []:Home Phone []:Other []:Is the information correct? [Y/n] yes└─$ cat /etc/passwd | grep testtest:x:1001:1001:,,,:/home/test:/bin/bash└─$ sudo cat /etc/shadow | grep testtest:$y$j9T$1L/PH8ddqysyageBD6TnF1$MNm4An/z6LHdRq0JEOnFuviXBequ23gbIG8U1A/f4F.:19112:0:99999:7::: |
可使用crypt和shadow的api对用户和密码进行验证
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <crypt.h>#include <unistd.h>char *crypt(const char *key, const char *salt);/* General shadow password file API */#include <shadow.h>struct spwd *getspnam(const char *name);struct spwd *getspent(void);void setspent(void);void endspent(void);struct spwd *fgetspent(FILE *stream);struct spwd *sgetspent(const char *s);int putspent(const struct spwd *p, FILE *stream);int lckpwdf(void);int ulckpwdf(void); |
下面的代码实例让用户输入用户名和密码,通过crypt和shadow API进行检验用户输入的用户名和密码是否匹配?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <unistd.h>#include <stdio.h>#include <shadow.h>#include <crypt.h>#include <stdlib.h>#include <errno.h>#include <string.h>/** user_auth - Authentication user name and password.* @user: user name.* @passwd: user password string.** on success return 0, return errno on error.*/int user_auth(const char *user, const char *passwd){ struct spwd *user_spwd; char *encrypted_pwd; if (!user || !passwd) return -EINVAL; user_spwd = getspnam(user); if (!user_spwd) return -errno; encrypted_pwd = crypt(passwd, user_spwd->sp_pwdp); if (!encrypted_pwd) return -errno; return abs(strcmp(encrypted_pwd, user_spwd->sp_pwdp));}int main(int argc, char *argv[]){ int ret; char *user = argv[1]; char *passwd = argv[2]; ret = user_auth(user, passwd); if (ret < 0) { printf("user auth failed, ret=%d\n", ret); return ret;} if (ret > 0) { printf("passwd not match, auth failed\n"); return ret;} printf("auth okay!\n"); return 0;} |
编译该程序是指定链接库crypt
| 1 | gcc auth.c -lcrypt |
然后使用该程序验证我们添加的用户test,密码是test,正确的输入用户名和密码时输出结果如下:
| 1 2 |
└─$ sudo ./a.out test testauth okay! |
如果故意输入错误密码,再次执行得到如下结果:
| 1 2 |
└─$ sudo ./a.out test hellopasswd not match, auth failed |
到此这篇关于linux用户及密码的存储和校验方法的文章就介绍到这了
2024-07-18
Centos 7 二进制安装配置 MariaDB数据库2024-07-18
Centos7默认firewalld防火墙使用命令大全2024-07-07
四种执行python系统命令的方法常用权限linux系统内有档案有三种身份 u:拥有者 g:群组 o:其他人这些身份对于文档常用的有下面权限:r:读权限,用户可以读取文档的内容,如用cat,more查看w:写权限,用户可以编辑文档x...
2024-07-07
然而,如果我们遵循通常的 WordPress 最佳实践,这些安全问题可以避免。在本篇中,我们会向你展示如何使用 WPSeku,一个 Linux 中的 WordPress 漏洞扫描器,它可以被用来找出你安装...
2024-07-03