Есть
char *login, *passwd;
, в которых забиты логин и пароль (все - нешифрованное). Как проверить правильность логина/пароля по файлу /etc/shadow?
>Есть
>char *login, *passwd;
>, в которых забиты логин и пароль (все - нешифрованное). Как проверить
>правильность логина/пароля по файлу /etc/shadow?
зашифровать passwd
вытащить по login из /etc/shadow зашифрованный пароль
сравнитьвозьмите исходники /bin/login
там все это есть
>Есть
>char *login, *passwd;
>, в которых забиты логин и пароль (все - нешифрованное). Как проверить
>правильность логина/пароля по файлу /etc/shadow?man shadow(3), crypt(3)
вместо shadow(3) возможно будет ман getspnam(3)...
>>Есть
>>char *login, *passwd;
>>, в которых забиты логин и пароль (все - нешифрованное). Как проверить
>>правильность логина/пароля по файлу /etc/shadow?
>
>man shadow(3), crypt(3)
>вместо shadow(3) возможно будет ман getspnam(3)...А как компилить?
Я пробовал
с флагами -lshadow и -L/usr/lib/libshadow.a, но при компиляции получается:...
main.o(.text+0x59): In function `main':
: undefined reference to `getspnam(char const*)'Где эта getspnam?
>main.o(.text+0x59): In function `main':
>: undefined reference to `getspnam(char const*)'
>
>Где эта getspnam?У меня она в glibc (то есть никаких дополнительных ключей не требуется), а где у вас - не знаю. Что за система-то хоть?
В мане нет упоминаний о каких-либо стандартах, так что возможно она есть не во всех системах. Но в Linux и SunOS вроде есть. В SunOS, насколько я понял, тоже в libc.
>>main.o(.text+0x59): In function `main':
>>: undefined reference to `getspnam(char const*)'
>>
>>Где эта getspnam?
>
>У меня она в glibc (то есть никаких дополнительных ключей не требуется),
>а где у вас - не знаю. Что за система-то хоть?Да Slackware 10.2 обычная, ну и glibc вроде стоит последняя...
Я ее еще поищу. Чем можно посмотреть, какие функции в библиотеке наличисвуют?
Видно, что-то мне на работе мешало ;) Все работает, а из дополнительных библиотек нужна только -lcrypt. По крайней мере, /etc/shadow проверяется такой вот програмкой:-------------8<----------------------------------------------------------------
// Проверялось на Slackware 10.2, где, правда, ядро и многое другое обноовлено
#include <string.h>
#include <stdio.h>
#include <shadow.h>
#include <pwd.h>
int shadow_check(char *user, char *passwd)
{
struct passwd *pw = getpwnam(user);
if (pw == NULL || pw->pw_passwd == '\0') {
return (0);
}
struct spwd *spwd;
spwd = getspnam(user);
char *epasswd = (char*)crypt(passwd, spwd->sp_pwdp);
if (strcmp(epasswd, spwd->sp_pwdp) != 0) {
return (0);
}
return (-1);
}int main(int argc, char **argv)
{
printf("%d\n", shadow_check("snm", "mnyammhrumm"));
return 0;
}
-------------8<----------------------------------------------------------------
Спасибо за помощь.
>Видно, что-то мне на работе мешало ;) Все работает, а из дополнительных
>библиотек нужна только -lcrypt. По крайней мере, /etc/shadow проверяется такой вот
>програмкой:
>
>-------------8<----------------------------------------------------------------
>// Проверялось на Slackware 10.2, где, правда, ядро и многое другое обноовлено
>
>#include <string.h>
>#include <stdio.h>
>#include <shadow.h>
>#include <pwd.h>
>int shadow_check(char *user, char *passwd)
>{
> struct passwd *pw = getpwnam(user);
> if (pw == NULL || pw->pw_passwd == '\0') {
> return (0);
> }
> struct spwd *spwd;
> spwd = getspnam(user);
> char *epasswd = (char*)crypt(passwd, spwd->sp_pwdp);
> if (strcmp(epasswd, spwd->sp_pwdp) != 0) {
> return (0);
> }
> return (-1);
>}
>
>int main(int argc, char **argv)
>{
> printf("%d\n", shadow_check("snm", "mnyammhrumm"));
> return 0;
>}
>-------------8<----------------------------------------------------------------
>Спасибо за помощь.
а может в даном случе стоит использовать PAM?
>а может в даном случе стоит использовать PAM?А чем он лучше?
Честно говоря, я не великий специалист, поэтому пока не осознаю его преимущества. В моем случае решение принимает cgi-программа (apache, ssl-соединение) на основе файла /etc/shadow и данных, которые пользователь ввел в форму.
Я бы и pam попробовал. Если у вас есть коротенький примерчик, с удовольствием его применю...
>>а может в даном случе стоит использовать PAM?
>
>А чем он лучше?Pluggable Authentication Module Library
Своей модульностью. Например, если в дальнейшем понадобится еще авторизовывать клиентов по mysql, ldap будет достаточно добавить модуль к pam. Сам же код приложение не изменится. В остальном (для примеров) достаточно обратить внимание на любой мало-мальски популярный сетевой продукт.
>ldap будет достаточно добавить модуль к pam. Сам же код приложение
>не изменится. В остальном (для примеров) достаточно обратить внимание на любой
>мало-мальски популярный сетевой продукт.А можете посоветовать какой-нибудь продукт с минимальным, но достаточным количеством кода? - в длинных программах трудно выискивать.
>>ldap будет достаточно добавить модуль к pam. Сам же код приложение
>>не изменится. В остальном (для примеров) достаточно обратить внимание на любой
>>мало-мальски популярный сетевой продукт.
>
>А можете посоветовать какой-нибудь продукт с минимальным, но достаточным количеством кода? -
>в длинных программах трудно выискивать.да тот же passwd,login, кажись.., вся система аутентификации unixов держится на этом
просто смотрите в исходниках где числится #include <pam.h>, или кеак там у вас.
тот фалй и розбирайте, но правильней все таки к документации
Как можно проверить пароль и ник?я создала себе почтовый ящик,захожу в чаты и т д пароль и ник не верные!Что посоветуете?