Шифрование паролей происходит следующим образом, - случайным образом выбираются два символа привязки [100], использующиеся для модификации алгоритма DES. Затем шифруется строка пробелов с использованием пароля в качестве ключа. Полученное 64 битое значение преобразуется в одинадцатисимвольную строку. Спереди к ней дописываются два символа привязки, и на этом весь процесс заканчивается.

Продемонстрировать работу функции crypt поможет следующий пример (на диске он расположен в файле “/SRC/ctypt.c”). Его компиляция потребует библиотеки ast.lib, распространяемой вместе с “UWIN” (смотри главу «Как запускать UNIX приложения на Windows»), если же такой библиотеки у читателя нет, можно воспользоваться готовым к работе файлом “/SRC/crypt.exe”. Для запуска программы в командной строке необходимо указать шифруемый пароль и отделенную пробелом привязку.

· #include «windows.h»· extern char *crypt(const char*, const char*);·· int main(int argc, char *argv[])· {· printf("%s\n", crypt (argv[1],argv[2]));· return 0;·}

Прототип функции crypt выглядит следующим образом: char * crypt(char *passwd, char *solt), где passwd - пароль для шифрования, а solt - два символа привязки. При успешном выполнении функция возвращает 13-символьный хеш готовый к употреблению - два символа привязки и 11-символьная хеш-сумма пароля.

Теперь можно реализовать некое подобие подсистемы аутентификации UNIX. Сперва необходимо добавить нового пользователя в файл passwd. Одни из вариантов реализации приведен ниже (на диске он находится в файле “/SRC/crypt.auth.add.new.user.c”). Для упрощения, поддерживается только один пользователь.

· #include «stdlib.h»· #include «stdio.h»· #include «time.h»·· extern char *crypt(const char*, const char*);·· int main(int argc, char *argv[])· {· int a;· char salt[3];· FILE *f;·· salt[2]=0;· srand((unsigned)time(NULL));· for(a=0;a«2;a++) salt[a]=0x22+(rand() % 0x40);· if (!(f=fopen("passwd","w"))) return -1;· fputs(crypt(argv[1], amp;salt[0]),f);· fclose(f);· return 0;·}

Запустим откомпилированный пример и укажем любой произвольный пароль в командной строке, например, так: “crypt.auth.add.new.user.exe 12345”. Теперь заглянем в файл “passwd”. Его содержание должно быть следующим “^37DjO25th9ps” [101]. Очевидно, для проверки правильности вводимого пользователем пароля необходимо выделить первые два символа привязки, вызвать функцию crypt, передав ей в качестве первого параметра проверяемый пароль, а вторым - привязку, в данном случае “^3”, и после завершения работы сравнить полученный результат с “^37DjO25th9ps”. Если обе строки окажутся идентичны - пароль указан верно и, соответственно, наоборот. Все это реализовано в следующем примере, приведенном ниже (на диске он находится в файле “/SRC/crypt.auth.c”):

· #include «stdio.h»· extern char *crypt(const char*, const char*);·· int main(int argc, char *argv[])· {· int a=1;· char salt[2];· char passwd[12];· char *x;· FILE *f;·· passwd[11]=0;· while(a++) if (argv[1][a]«0x10) {argv[1][a]=0;break;}·· if (!(f=fopen("passwd","r"))) return -1;· fgets( amp;salt[0],3,f);· fgets( amp;passwd[0],12,f);· fclose(f);·· if (strcmp( amp;passwd[0],crypt(argv[1], amp;salt[0])+2))· printf("Wrong password!\n");· else· printf("Password ok\n");·· return 0;·}

Запустим “crypt.auth.exe”, указав в командной строке пароль “12345”. Программа подтвердит правильность пароля. А теперь попробуем ввести другой пароль, - и результат не заставит себя долго ждать.

· crypt.auth.exe 12345

· Password ok

· crypt.auth.exe MyGoodPasswd

· Wrong password!

Перейти на страницу:

Похожие книги