linux c 驗證 linux 使用者密碼

2021-07-09 06:43:18 字數 1682 閱讀 9596

最初linux將使用者的密碼通過某種one-way function得到乙個雜湊(加密)後的字串,並儲存該字串在密碼檔案中,但這種方式易遭受字典攻擊,攻擊者只有準備好字典,使用相同的one-way function計算出對應的值,逐個對比就ok就可以攻破。

為了提高安全性,引入salt,所謂的salt,即為乙個隨機數,引入的時候為乙個2字元的字串(從[a-za-z0-9./]共64個字元選取,後來salt擴充套件到最多12個字元),當使用者設定密碼時,會隨機生成乙個salt,與使用者的密碼一起加密,得到乙個加密的字串(salt以明文形式包含在該字串中),儲存到密碼檔案中,這樣就將攻擊的難度擴大了64*64即4096倍。

crypt將使用者的key和salt一起適應某種演算法進行加密(雜湊)

char *crypt(const char *key, const char *salt);
crypt中可以使用多種加密(雜湊)機制,包括最初的des,還有後來為提高安全性引入的md5,blowfish,sha-256,sha-512.

crypt為支援不同的方式,將salt進行格式化,格式為:

$id$salt$encoded (這也是儲存在shadow檔案中的格式)

這裡不同id代表不同的演算法,不同演算法salt的長度也不同。

id

method

實際加密後的密碼長度

1

md5(12 個 salt 字元)

22

2a

blowfish

只在某些發行版中支援

5

sha-256 (12 個 salt 字元)

43

6

sha-512 (12 個 salt 字元)

86

最初的des方式的salt為2個字元(a-za-z0-9/+)提供了64*64=4096種可能性。然後將使用者key與salt拼接成乙個新的字串,用這個字串作為金鑰對某個原始串(通常為全0)進行des加密,得到11個字元,然後將這11個字元接到salt後面即為使用者加密後的密碼。

使用 c 語言驗證某個使用者的密碼:

原始碼如下:

#include #include #include #include int main(int argc, char **argv)

if(strcmp(sp->sp_pwdp, (char*)crypt(argv[2], sp->sp_pwdp)) == 0)

else

return 0;

}

注意:執行的時候需要 root 許可權。。

用linux c寫的驗證系統使用者密碼的程式

通過環境變數user和pass指定使用者密碼,如果驗證失敗則sleep 2秒防止惡意攻擊。程式需要owner為root來執行,並設定suid保證其他使用者能執行。這個簡單的程式會有什麼漏洞不?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

python 進行linux 使用者驗證

用python 程式進行linux 使用者驗證,需要具備兩個人條件 1 獲取待驗證使用者相應密碼加密用的 salt salt可理解為加密金鑰 salt在 etc shadow 檔案中 詳情請參見 以使用者zero為例 zero 6 f3mzhurv 1gcuhkgsdizzfjagozfqrimfb...

嵌入式linux使用者密碼驗證

嵌入式linux使用者登入密碼驗證 開發板啟動核心後,一般是直接按回車鍵就能直接進入檔案系統,以前一直搞不懂為什麼不需要使用者密碼 驗證,今天上網檢視了一下,原來是因為配置檔案的問題。原來一直以為使用者密碼驗證是由運用程式做的,後來,上網查了一下,原來是由檔案系統完成的,在編譯busybox的時候把...