通过 C 中的文件使用 crypt 函数进行身份验证(分段错误)
Authentication with crypt function via File in C (Segmentation fault)
我有下面的代码,我首先尝试在情况 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[] = "$........";
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;
}
答案是我忘了分配内存...
#define pass_size 1000
pass=calloc(pass_size,sizeof(char));
我有下面的代码,我首先尝试在情况 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[] = "$........";
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;
}
答案是我忘了分配内存...
#define pass_size 1000
pass=calloc(pass_size,sizeof(char));