Учитывая имя пользователя linux и пароль, как я могу проверить, является ли он действительной учетной записью?

Итак, мой вопрос прямо с учетом имени пользователя linux и пароля, как я могу проверить, является ли он действительной учетной записью?

Ответ 1

Вы можете проверить правильность заданного пароля для данного имени пользователя, используя теневой файл.

В большинстве современных дистрибутивов хэшированные пароли хранятся в теневом файле /etc/shadow (который доступен только для чтения root). Как 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.

Ответ 2

Если вас беспокоит безопасность (которой вы должны быть), принятый ответ представляет угрозу безопасности, оставляя незашифрованный пароль в файле ~/.bash_history. Имея это в виду, было бы лучше попробовать войти в систему или, возможно, удалить эту запись из ~/.bash_history.

Ответ 3

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