web-dev-qa-db-fra.com

Étant donné un nom d'utilisateur Linux et un mot de passe, comment puis-je vérifier si le compte est valide?

Donc, ma question est simple, étant donné un nom d'utilisateur linux et un mot de passe, comment puis-je vérifier s'il s'agit d'un compte valide?

16
smit

Vous pouvez valider qu'un mot de passe donné est correct pour un nom d'utilisateur donné à l'aide du fichier shadow.

Sur la plupart des distributions modernes, les mots de passe hachés sont stockés dans le fichier shadow/etc/shadow (qui n'est lisible que par root). En tant que root, tirez la ligne du fichier shadow pour l'utilisateur donné comme suit:

cat /etc/shadow | grep username

Vous verrez quelque chose comme ça:

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

Après le nom d'utilisateur, il y a 1 $. Cela indique qu'il s'agit d'un hachage MD5. Après cela, il y a un autre $, puis (dans ce cas) TrOIigLp suivi d'un autre $. TrOIigLp est le sel. Ensuite, le mot de passe haché, qui a été haché à l'aide du sel - dans ce cas, PUHL00kS5UY3CMVaiC0/g0.

Maintenant, vous pouvez utiliser openssl pour hacher le mot de passe donné en utilisant le même sel, comme suit:

openssl passwd -1 -salt TrOIigLp

Entrez le mot de passe indiqué lorsque vous y êtes invité. La commande openssl doit calculer le hachage MD5 à l'aide du sel fourni, et il doit être identique à celui indiqué ci-dessus dans le fichier shadow. Le -1 dans la commande ci-dessus est pour le hachage MD5.

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 ${@}
1

Si vous êtes préoccupé par la sécurité (ce que vous devriez être), la réponse acceptée représente un risque pour la sécurité en laissant le mot de passe en texte brut dans le fichier ~/.bash_history. Dans cet esprit, il serait préférable d’essayer de vous connecter ou de supprimer cette entrée du ~/.bash_history.

0
Stringers