だから私の質問は、Linuxユーザー名とパスワードが与えられた場合、それが有効なアカウントであるかどうかをどのようにテストできますか?
シャドウファイルを使用して、特定のパスワードが特定のユーザー名に対して正しいことを検証できます。
最近のほとんどのディストリビューションでは、ハッシュされたパスワードはシャドウファイル/ etc/shadow(rootのみが読み取り可能)に保存されます。ルートとして、指定されたユーザーのシャドウファイルから次のように行を引き出します。
cat /etc/shadow | grep username
次のようなものが表示されます。
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
ユーザー名の後には$ 1があります。これは、MD5ハッシュであることを示しています。その後、別の$があり、(この場合)TrOIigLpの後に別の$が続きます。 TrOIigLpは塩です。その後は、ソルトを使用してハッシュ化されたハッシュ化されたパスワードです。この場合はPUHL00kS5UY3CMVaiC0/g0です。
次のように、opensslを使用して、同じソルトを使用して指定されたパスワードをハッシュできます。
openssl passwd -1 -salt TrOIigLp
プロンプトが表示されたら、指定されたパスワードを入力します。opensslコマンドは、提供されたソルトを使用してMD5ハッシュを計算する必要があり、シャドウファイルからの上記とまったく同じである必要があります。上記のコマンドの-1は、MD5ハッシュ用です。
セキュリティを心配している場合(そうあるべきです)、受け入れられる答えは、~/.bash_history
ファイルにプレーンテキストのパスワードを残すことによるセキュリティリスクを表します。これを念頭に置いて、ログインを試すか、~/.bash_history
からこのエントリを削除することをお勧めします。
#! /bin/bash
# (GPL3+) Alberto Salvia Novella (es20490446e)
passwordHash () {
password=${1}
salt=${2}
encryption=${3}
hashes=$(echo ${password} | openssl passwd -${encryption} -salt ${salt} -stdin)
echo $(substring ${hashes} "$" "3")
}
passwordIsValid () {
user=${1}
password=${2}
encryption=$(secret "encryption" ${user})
salt=$(secret "salt" ${user})
salted=$(secret "salted" ${user})
hash=$(passwordHash ${password} ${salt} ${encryption})
[ ${salted} = ${hash} ] && echo "true" || echo "false"
}
secret () {
secret=${1}
user=${2}
shadow=$(shadow ${user})
if [ ${secret} = "encryption" ]; then
position=1
Elif [ ${secret} = "salt" ]; then
position=2
Elif [ ${secret} = "salted" ]; then
position=3
fi
echo $(substring ${shadow} "$" ${position})
}
shadow () {
user=${1}
shadow=$(cat /etc/shadow | grep ${user})
shadow=$(substring ${shadow} ":" "1")
echo ${shadow}
}
substring () {
string=${1}
separator=${2}
position=${3}
substring=${string//"${separator}"/$'\2'}
IFS=$'\2' read -a substring <<< "${substring}"
echo ${substring[${position}]}
}
passwordIsValid ${@}