猿问

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

我有下面的代码,在情况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;

}



侃侃尔雅
浏览 266回答 1
1回答

慕神8447489

答案是我忘了分配内存。#define pass_size 1000&nbsp;pass=calloc(pass_size,sizeof(char));
随时随地看视频慕课网APP
我要回答