Linux

在典型的 Unix(例如 Gnu/Linux)中,使用什麼加密機制將密碼儲存在 /etc/shadow 中?

  • February 15, 2020

(從新手的角度來看)

前幾天我在思考一個典型的“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 之類的密碼學以及不同的加鹽機制),但它是我能想到的最好的……也許有點輕推專家們對它的實際工作方式有正確的指導。(:

加密機制是我非常好奇的。

您將使用一個緩慢的、加鹽的、安全的散列函式:密鑰派生函式。

  • 我們使用雜湊函式來隱藏密碼,沒有人可以讀取它,甚至管理員也無法讀取。雜湊不能反轉。當使用者登錄時,我們對密碼輸入進行雜湊處理,並與儲存的雜湊值進行比較。
  • 加鹽是在散列之前在密碼中添加一個大的隨機字元串。我們必須將鹽與雜湊一起儲存。我們這樣做是為了減緩字典攻擊。字典攻擊是散列已知常用密碼的字典,並查找匹配項。現在攻擊者需要為每個使用者創建一個字典(因為他們都有一個唯一的鹽)。
  • 我們使用慢散列來進一步減慢字典攻擊。每次使用者登錄時都會以計算時間為代價。

你可以閱讀更多

有關某些 Gnu/Linux 系統上使用的內容,請參閱此相關問題

編輯/etc/shadow——不要這樣做。

引用自:https://unix.stackexchange.com/questions/567674