我有下面的代码,在情况1中我首先尝试:注册一个新密码并将其写入文件,此方法有效,在情况2中我遇到的问题是:我正在尝试使用户提供一个密码以通过crypt函数对其进行加密,然后使用先前文件中的所有加密密码对其进行身份验证。但是,当我对此进行编译时,出现错误“ Segmentation Fault”。在我看来,问题将出在log_password和对加密消息的转换中。任何帮助将是巨大的。
#define _GNU_SOURCE
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <crypt.h>
#include <string.h>
#include <sys/stat.h>
int
main(void)
{
FILE *f=fopen("shadow.txt","a+");
char * line=NULL;
unsigned long seed[2];
char *log_password,salt[] = "$1$........";
const char *const seedchars =
"./0123456789ABCDEFGHIJKLMNOPQRST"
"UVWXYZabcdefghijklmnopqrstuvwxyz";
char *password,*pass;
int i,ans;
/* Generate a (not very) random seed.
You should do it better than this... */
seed[0] = time(NULL);
seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);
/* Turn it into printable characters from ‘seedchars’. */
for (i = 0; i < 8; i++)
salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];
printf("Press 1 for Register.\n");
printf("Press 2 for Login.\n");
printf("Press 3 for Exit.\n");
scanf("%d",&ans);
switch(ans)
{
case 1:
password = crypt(getpass("Password:"), salt);
fprintf(f,"%s \n",password);
printf("Succesfull Register in file\n");
fclose(f);
break;
case 2:
fgets(pass,34,f);
log_password = crypt(getpass("Login Password:"), pass);
int ok;
ok = strcmp (log_password, pass) == 0;
puts(ok ? "Access granted." : "Access denied.");
return ok ? 0 : 1;
break;
case 3:
printf("Bye\n");
exit(1);
break;
default:
printf("Try Again.\n");
break;
}
return 0;
}
慕神8447489