Итак, мой вопрос прямо с учетом имени пользователя 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 ${@}