Linux系統程式設計 (4)使用者與組 密碼加密與認證

2021-10-01 21:28:36 字數 2322 閱讀 8669

在討論程序憑證之前,我們先來搞清楚使用者與組的概念。每個使用者都擁有乙個唯一的使用者名稱和乙個與之相關的數值型使用者識別符號(uid),乙個使用者可以隸屬於乙個或者多個組。每個組也都有唯一的名稱和乙個組識別符號(gid)。使用者與組的主要用途包括以下兩個方面:確定各種系統資源的所有權對賦予程序訪問上述資源的許可權加以控制

針對系統中每個使用者賬號,系統密碼檔案/etc/passwd會專列一行進行描述,每行有7個字段,分別代表以下所述:

在unix中,之前/etc/passwd中維護所有的使用者資訊,包括加密處理的密碼,因為許多非特權級別系統工具需要讀取密碼檔案中其他的資訊,密碼檔案不得不對所有的使用者開放讀取許可權,這就為密碼破解工具提供了可乘之機,他們可以利用同樣的工具將可能的密碼經過加密得出的加密密碼與/etc/passwd中對應的加密密碼比對,從而有可能獲取密碼。為了防止類似攻擊,/etc/shadow出現了。

其理念是:使用者的所有非敏感資訊存放於「人人可讀」的密碼檔案中,而經過加密處理的密碼則有shadow密碼檔案單獨維護,僅供具有特權的程式讀取。

/etc/shadow 檔案內容

登入名:經過加密的密碼:其他字段

系統中的每個組在組檔案/etc/group中都對應著一條記錄,每條記錄包含4個字段。

組名:加密密碼:組id:使用者列表

注意:getpwnam和getpwuid返回的指標指向由靜態分配而成的記憶體,故二者不可重入。因為getpw函式在程式中自定義一塊靜態儲存區,每呼叫一次getpw函式,這個靜態儲存區就會被重寫一次,比如以下**示例:

int

main

(int argc,

char

*ar**)

本來想要獲取michael使用者和roor使用者的資訊,建立兩個指標,分貝指向兩個返回結果,結果發現列印資訊都是root,說明後面呼叫的getpwnam函式重寫了struct passwd這個結構體,把前面呼叫getpwnam函式時寫入的michael使用者的資訊給覆蓋了。

unix系統採用單向加密演算法對密碼進行加密,這意味著由密碼的加密形式將無法還原出原始密碼。因此,驗證候選密碼的唯一方法是使用同一演算法對其進行加密,並且加密結果與儲存在/etc/shadow檔案中的密碼進行匹配。加密演算法封裝在crypt()函式之中。

crypt函式返回的加密字串為靜態分配而成,內容即為經過加密處理的密碼,因為靜態分配記憶體,所以連續兩次呼叫,後續呼叫會覆蓋前面的加密密碼結果。要想在linux中使用crypt(),在編譯程式的時候需要開啟-lcrypt選項,以便程式鏈結crypt庫。

加密程式示例:

/* compile with -lcrypt */

#if ! defined(__sun)

#define _bsd_source

/* get getpass() declaration from */

#ifndef _xopen_source

#define _xopen_source

/* get crypt() declaration from */

#endif

#endif

#include

#include

#include

#include

#include

"tlpi_hdr.h"

intmain

(int argc,

char

*ar**)

printf

("successfully authenticated: uid=%ld\n",(

long

) pwd-

>pw_uid)

;/* now do authenticated work... */

exit

(exit_success)

;}

讀取密碼的程式應立即加密密碼,並盡快將密碼的銘文從記憶體中抹去,只有這樣,才能基本杜絕一下事情發生:惡意之徒借程式崩潰之機,讀取核心轉儲檔案以獲取密碼。還有其他方法可以**未經加密的密碼:

包含密碼的虛擬記憶體頁執行交換操作,那麼特級程式就能從交換檔案中讀取密碼

擁有足夠許可權的程序可以通過讀取/dev/mem來嘗試發現密碼

Linux系統程式設計 4

1.網路4層模型 網路7層模型 只是概念未實現 只是為了分析方便 2.tcp ip協議是整個協議棧最大的協議,所以就以他們為名 3.tcp 可靠 面向連線 基於流 udp 不可靠 無連線 基於資料報 4.埠號 1024 常用 5.流式套接字 原始套接字 測試使用 小端 反之 主機位元組序 7.共享記...

Linux系統程式設計 程序組

1 程序組,也稱之為作業,bsd與1980年前後向unix中增加的乙個新特性,代表乙個或多個程序的集合。每個程序都屬於乙個程序組,在waitpid函式和kill函式的引數中都曾經使用到,作業系統設計的程序組的概念,是為了簡化對多個程序的管理。當父程序建立子程序的時候,預設子程序與父程序屬於同乙個程序...

Linux系統程式設計4 編譯鏈結

編譯 的步驟 預處理器 源 經過預處理器處理後變成了修改後的源 主要是處理 符號開頭的特殊行 編譯器 編譯修改後的源 將翻譯後的機器語言指令,也就是目標 儲存在目標檔案中 目標檔案 不是完整的程式,因為它不包含一些必要的執行時庫,所以無法執行 執行時庫 執行一些常規操作或者某些困難任務預先編寫好的 ...