为了账号安全,请及时绑定邮箱和手机立即绑定

通过C中的文件通过crypt函数进行身份验证(分段错误)

通过C中的文件通过crypt函数进行身份验证(分段错误)

侃侃尔雅 2021-04-09 13:14:45
我有下面的代码,在情况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>intmain(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;}
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

答案是我忘了分配内存。


#define pass_size 1000

 pass=calloc(pass_size,sizeof(char));


查看完整回答
反对 回复 2021-04-16
  • 1 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信