時間:2022-05-22來源:www.farandoo.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 test Adding 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 test Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y /n ] yes └─$ cat /etc/passwd | grep test test :x:1001:1001:,,,: /home/test : /bin/bash └─$ sudo cat /etc/shadow | grep test test :$y$j9T$1L /PH8ddqysyageBD6TnF1 $MNm4An /z6LHdRq0JEOnFuviXBequ23gbIG8U1A/f4F .:19 112: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 test auth okay! |
如果故意輸入錯誤密碼,再次執行得到如下結果:
1 2 |
└─$ sudo . /a .out test hello passwd not match, auth failed |
到此這篇關于linux用戶及密碼的存儲和校驗方法的文章就介紹到這了
2022-06-02
linux下安裝啟動性能測試工具redis benchmark教程2022-05-22
linux中ping命令的作用介紹2022-05-09
Windows11 Linux子系統下載安裝圖文教程 Win11 Linux子系統怎么下載安裝?現在還是有用戶不知道如何重裝系統,都是請別人幫忙安裝,那么蘋果裝個雙系統多少錢呢?一般價格是100左右,具體價格還得看地方,下面小編就給大家帶來蘋果裝個雙系統多少錢的詳細介紹。...
2022-04-13
怎么遠程登錄Linux CentOS系統?許多Linux系統用戶都知道Linux最常用的就是作為服務器端放在機房中,而我們用戶不可能實時待在機房中,那么有沒有什么方法遠程操控Linux系統呢?...
2022-04-13