webentwicklung-frage-antwort-db.com.de

Wie kann ich anhand eines Linux-Benutzernamens und eines Kennworts testen, ob es sich um ein gültiges Konto handelt?

Meine Frage ist also einfach, wenn Sie einen Linux-Benutzernamen und ein Passwort angeben.

16
smit

Sie können anhand der Schattendatei überprüfen, ob ein bestimmtes Kennwort für einen bestimmten Benutzernamen korrekt ist.

Bei den meisten modernen Distributionen werden die Hash-Passwörter in der Schattendatei/etc/shadow gespeichert (die nur von root gelesen werden kann). Ziehen Sie als root die Zeile aus der Schattendatei für den angegebenen Benutzer wie folgt:

cat /etc/shadow | grep username

Sie werden so etwas sehen:

username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::

Nach dem Benutzernamen gibt es $ 1. Dies zeigt an, dass es sich um einen MD5-Hash handelt. Danach gibt es noch ein weiteres $, dann (in diesem Fall) TrOIigLp, gefolgt von einem weiteren $. TrOIigLp ist das Salz. Danach folgt das gehashte Passwort, das mit dem Salt gehashed wurde - in diesem Fall PUHL00kS5UY3CMVaiC0/g0.

Jetzt können Sie openssl verwenden, um das angegebene Passwort mit demselben Salt wie folgt zu hashten:

openssl passwd -1 -salt TrOIigLp

Geben Sie das entsprechende Kennwort ein, wenn Sie dazu aufgefordert werden. Der Befehl openssl sollte den MD5-Hash anhand des bereitgestellten Salt-Werts berechnen. Er sollte genauso wie in der Schattendatei oben angegeben sein. Das -1 im obigen Befehl gilt für MD5-Hashing.

35
mti2935
#! /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 ${@}

Wenn Sie sich Sorgen um die Sicherheit machen (was Sie sollten), stellt die akzeptierte Antwort ein Sicherheitsrisiko dar, wenn Sie das Klartext-Kennwort in der Datei ~/.bash_history belassen. Aus diesem Grund ist es besser, sich anzumelden oder diesen Eintrag aus dem ~/.bash_history zu entfernen.

0
Stringers