Другой способ (возможно, более интересен для его теоретического содержания, чем для его пратических приложений).
Пользовательские пароли хранятся в /etc/shadow.
Пароли, хранящиеся здесь, зашифрованы, в последних выпусках Ubuntu с использованием SHA-512.
В частности, при создании пароля пароль в открытом тексте солен и зашифрован через SHA-512.
Одно из решений было бы тогда солить / зашифровать данный пароль и сопоставить его с зашифрованным паролем пользователя, хранящимся в записи /etc/shadow данного пользователя.
Чтобы быстро описать, как пароли хранятся в каждой записи пользователя /etc/shadow , вот пример /etc/shadow для пользователя foo с паролем bar:
foo:$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/:16566:0:99999:7:::
foo: имя пользователя 6: тип шифрования пароля lWS1oJnmDlaXrx1F: соль шифрования пароля [ f18]: SHA-512 засоленный / зашифрованный пароль Чтобы соответствовать данному паролю bar для данного пользователя foo, первое, что нужно сделать, это получить соль:
$ sudo getent shadow foo | cut -d$ -f3
lWS1oJnmDlaXrx1F
Затем следует получить полную соль ed / encrypted password:
$ sudo getent shadow foo | cut -d: -f2
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/
Затем данный пароль можно солить / зашифровать и сопоставить с паролем засоленного / зашифрованного пользователя, хранящимся в /etc/shadow:
$ python -c 'import crypt; print crypt.crypt("bar", "$6$lWS1oJnmDlaXrx1F")'
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/
Они совпадение! Все, что помещено в скрипт bash:
#!/bin/bash
read -p "Username >" username
IFS= read -p "Password >" password
salt=$(sudo getent shadow $username | cut -d$ -f3)
epassword=$(sudo getent shadow $username | cut -d: -f2)
match=$(python -c 'import crypt; print crypt.crypt("'"${password}"'", "$6$'${salt}'")')
[ ${match} == ${epassword} ] && echo "Password matches" || echo "Password doesn't match"
Выход:
$ ./script.sh
Username >foo
Password >bar
Password matches
$ ./script.sh
Username >foo
Password >bar1
Password doesn't match