Linux在典型的 Unix(例如 Gnu/Linux)中,使用什麼加密機制將密碼儲存在
在典型的 Unix(例如 Gnu/Linux)中,使用什麼加密機制將密碼儲存在 /etc/shadow
中?
(從新手的角度來看)
前幾天我在思考一個典型的“passwd”命令在 LINUX 作業系統中是如何工作的。例如,當我們輸入“passwd”時,會出現一個提示讓我們輸入密碼,然後它會使用加密算法保存該密碼,然後保存在**/etc/shadow中。所以我帶來了我自己的“密碼/登錄模擬”。最初,它將使用者名及其密碼以“username::password”的形式保存在名為mango.txt**的文件中,下次同一使用者嘗試登錄時,它會詢問使用者名和密碼。所以我想出了這兩個腳本。
腳本 1:提示輸入使用者名和密碼並將其保存在名為 mango.txt 的文件中。
# Title: username.sh #!/bin/bash # What I'm planning to do here is that, #create a username script which allows a #user to add themselves by puting in #their #names # and their password at the time of #login, it will save itself to a file #with #the username and password. # If username already exists, tells the #user that a user with the same name #exits, else add the new user. # along with a password. The password is # saved in a md5 hash form. exec 2>/dev/null touch mango.txt echo -n "Enter username: " read usame if [ "$usame" == "" ]; then echo -e "Username can not be blank\n" ./username.sh else grep -q $usame mango.txt if [ "$?" == 0 ]; then echo -e "A username with the same name already exists\n" ./username.sh else echo -n "Password: " read -s -p "Password: " passwd while true; do if [ "$passwd" == "" ]; then echo -e "Password can not be blank\n" else echo $usame::$(echo $passwd | md5sum) >> mango.txt echo -e "\nUser $usame added\n" break fi done fi fi
腳本 2:如果可以將其添加到“bash.bashrc”中,那麼它將在每次終端啟動時執行,並詢問使用者名和密碼。如果使用者名和密碼與 mango.txt 中的使用者名和密碼相同,則允許使用者登錄,否則終端退出(;普通密碼以 md5sum 形式與 mango.txt 文件密碼進行比較。
#Title: login.sh # A simple login bash script #trap interrupts your keyboard if you #press ctrl+z or ctrl+c trap '' INT TSTP read -p "Enter username: " usname grep -q $usname mango.txt if [ "$?" -gt 0 ]; then echo "Username not found" sleep 1 pkill -9 bash #That's a bit too much I guess, but oh well else read -s -p "Password: " password if [ "$password" == "" ]; then echo "Password can not be blank" ./login.sh else #saves the password in md5sum format in tmp.txt echo $password | md5sum > tmp.txt tmp="$(cat tmp.txt)" #if the md5 hashes match, then allow login saying yo cat mango.txt | grep -q $usname::$tmp if [ "$?" == 0 ]; then echo -e "\nyo" #else print login failed else echo -e "\nLogin failed" sleep 1 pkill -9 bash fi fi fi rm tmp.txt # Deletes the tmp file afterwards
我很確定它與在 LINUX 系統中的確切工作方式相去甚遠(更不用說 ccrypt 和 scrypt 之類的密碼學以及不同的加鹽機制),但它是我能想到的最好的……也許有點輕推專家們對它的實際工作方式有正確的指導。(:
加密機制是我非常好奇的。
您將使用一個緩慢的、加鹽的、安全的散列函式:密鑰派生函式。
- 我們使用雜湊函式來隱藏密碼,沒有人可以讀取它,甚至管理員也無法讀取。雜湊不能反轉。當使用者登錄時,我們對密碼輸入進行雜湊處理,並與儲存的雜湊值進行比較。
- 加鹽是在散列之前在密碼中添加一個大的隨機字元串。我們必須將鹽與雜湊一起儲存。我們這樣做是為了減緩字典攻擊。字典攻擊是散列已知常用密碼的字典,並查找匹配項。現在攻擊者需要為每個使用者創建一個字典(因為他們都有一個唯一的鹽)。
- 我們使用慢散列來進一步減慢字典攻擊。每次使用者登錄時都會以計算時間為代價。
你可以閱讀更多
- https://en.wikipedia.org/wiki/Hash_function
- https://en.wikipedia.org/wiki/Secure_Hash_Algorithms
- https://en.wikipedia.org/wiki/Cryptographic_hash_function#Password_verification
- https://en.wikipedia.org/wiki/Key_derivation_function
- https://www.youtube.com/watch?v=b4b8ktEV4Bg
- https://www.youtube.com/watch?v=DMtFhACPnTY
有關某些 Gnu/Linux 系統上使用的內容,請參閱此相關問題
編輯
/etc/shadow
——不要這樣做。