일반적인 Unix(예: Gnu/Linux)에서는 "/etc/shadow"에 비밀번호를 저장하는 데 어떤 암호화 메커니즘이 사용됩니까?

일반적인 Unix(예: Gnu/Linux)에서는 "/etc/shadow"에 비밀번호를 저장하는 데 어떤 암호화 메커니즘이 사용됩니까?

(초보 입장에서)

얼마 전 나는 LINUX 운영 체제에서 일반적인 "passwd" 명령이 어떻게 작동하는지 생각하고 있었습니다. 예를 들어 "passwd"를 입력하면 비밀번호를 입력하라는 메시지가 나타나고 암호화 알고리즘을 사용하여 비밀번호를 저장한 다음/etc/shadow. 그래서 나는 내 자신의 "비밀번호/로그인 모의"를 가져왔습니다. 처음에는 사용자 이름과 비밀번호를 다음과 같은 파일에 저장합니다.망고.txt"username::password" 형식에서는 동일한 사용자가 다음에 로그인을 시도할 때 사용자 이름과 비밀번호를 묻습니다. 그래서 저는 이 두 가지 스크립트를 생각해 냈습니다.

스크립트 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와 다른 솔팅 메커니즘과 같은 암호화는 말할 것도 없고). 그러나 이것이 제가 생각할 수 있는 최고입니다.. 아마도 작동할 것입니다. 전문가는 실제로 어떻게 작동하는지에 대한 올바른 지침을 제공할 수 있습니다. (:

암호화 메커니즘은 제가 매우 궁금해하는 부분입니다.

답변1

당신은느린,소금에 절인,안전한해시 함수: 키 파생 함수입니다.

  • 우리는 해시 기능을 사용하여 비밀번호를 숨기고 관리자를 포함한 누구도 비밀번호를 읽을 수 없습니다. 해시는 되돌릴 수 없습니다. 사용자가 로그인하면 비밀번호 입력을 해시하고 저장된 해시와 비교합니다.

  • 솔팅(Salting)은 비밀번호를 해시하기 전에 비밀번호에 큰 무작위 문자열을 추가하는 것입니다. 해시와 함께 소금을 저장해야 합니다. 이는 사전 공격을 완화하기 위해 수행됩니다. 사전 공격은 알려진 일반적인 비밀번호 사전을 해시하고 일치하는 비밀번호를 찾는 것입니다. 이제 공격자는 각 사용자에 대한 사전을 생성해야 합니다(모두 고유한 솔트를 갖기 때문).

  • 우리는 사전 공격 속도를 더욱 늦추기 위해 느린 해싱을 사용합니다. 사용자가 로그인할 때마다 계산 시간이 소모됩니다.

더 읽어보실 수 있습니다

일부 Gnu/Linux 시스템에서 사용되는 내용은 이 관련 질문을 참조하세요.

편집 /etc/shadow- 이러지 마세요.

관련 정보