(初心者の立場から)
しばらく前に、LINUXオペレーティングシステムで一般的な「passwd」コマンドがどのように機能するかを考えていました。たとえば、「passwd」と入力するとパスワードを入力するように求められ、暗号化アルゴリズムを使用してパスワードを保存してから/etc/shadow。だから私は自分自身の「パスワード/ログインモック」を持ってきました。まず、ユーザー名とパスワードを次のファイルに保存します。mango.txt「username::password」形式では、同じユーザーが次回ログインしようとしたときにユーザー名とパスワードを要求します。だから私はこの2つのスクリプトを思い出しました。
スクリプト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
あなたは遅い、塩漬け、安全ハッシュ関数:キー派生関数。
ハッシュ機能を使用してパスワードを非表示にし、管理者を含む誰もパスワードを読み取ることはできません。ハッシュは元に戻せません。ユーザーがログインすると、パスワード入力をハッシュし、保存されたハッシュと比較します。
ソルティングは、パスワードをハッシュする前に、パスワードに大きなランダムな文字列を追加することです。ハッシュと一緒に塩を保存する必要があります。これは事前攻撃を軽減するために行われます。辞書攻撃は、既知の一般的なパスワード辞書をハッシュし、一致するパスワードを見つけることです。攻撃者は各ユーザーの辞書を作成する必要があります(すべて独自のソルトを持つため)。
我々は、事前攻撃速度をさらに遅くするために遅いハッシュを使用します。ユーザーがログインするたびに計算時間がかかります。
もっと読むことができます
- 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
- これはしないでください。