А знаете ли вы, что /etc/shadow может прочитать только root? Да, это конечно круто - ни один засранец, не сможет подбирать пароли пользователей перебором. Но! При этом ни один честный пользователь не сможет реализовать авторизацию.
На всех системах, за исключением Slackware (Патрик, ты молодец и хороший человек), getpwnam вернёт вам что-то типа '*' вместо хэша пароля, если вы не root. Объяснить это легко - а нефиг пользователю знать хэши паролей. Во всяком случае так думают современные разработчики.
Ладно, забиваем на getpwnam и смотрим в сторону pam_authenticate. И что мы видим? При авторизации через модуль pam_unix.so мы попадаем на те же грабли. Динамическая библиотека работает в контексте программы и, соответственно, имеет те же самые права, что и программа её использующая - /etc/shadow по прежнему недоступна обычным пользователям.
И вот тут интересный момент - всё говорит о том, что не существует _универсального_ и _правильного_ способа дать пользователю возможность проверять авторизацию. Есть вариант использовать «костыли» в виде rpc сервера, работающего от root и дающего возможность локальным пользователям проверять авторизацию. Но без костылей - варианта нет.
И да, почему бы просто не поставить suid и не заморачиваться с проблемой? Как минимум три причины:
1. У пользователя может не быть прав, чтобы установить suid root
2. Программа может содержать ошибки и даже наличие исходного кода программы не даёт гарантии что среднестатистический админ обнаружит ошибку.
3. Программа может распространяться в бинарном виде. На Земле не так много людей, готовых поставить suid на программу без исходного кода.
Таки образом - выхода нет?