web-dev-qa-db-ja.com

Linuxのユーザー名とパスワードが与えられた場合、それが有効なアカウントであるかどうかをテストするにはどうすればよいですか?

だから私の質問は、Linuxユーザー名とパスワードが与えられた場合、それが有効なアカウントであるかどうかをどのようにテストできますか?

19
smit

シャドウファイルを使用して、特定のパスワードが特定のユーザー名に対して正しいことを検証できます。

最近のほとんどのディストリビューションでは、ハッシュされたパスワードはシャドウファイル/ 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ハッシュ用です。

37
mti2935

セキュリティを心配している場合(そうあるべきです)、受け入れられる答えは、~/.bash_historyファイルにプレーンテキストのパスワードを残すことによるセキュリティリスクを表します。これを念頭に置いて、ログインを試すか、~/.bash_historyからこのエントリを削除することをお勧めします。

2
Stringers
#! /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 ${@}