Аутентификация с помощью функции crypt через File in C (Ошибка сегментации) - PullRequest
0 голосов
/ 04 мая 2018

у меня есть приведенный ниже код, и я пытаюсь в первую очередь в случае 1: зарегистрировать новый пароль и записать его в файл, это работает, проблема, которая у меня есть, в случае 2: ​​где я пытаюсь сделать Пользователь дает пароль для шифрования через функцию crypt, а затем аутентифицирует его со всеми зашифрованными паролями в предыдущем файле. Но когда я компилирую это, я получаю сообщение об ошибке «Ошибка сегментации». По моему мнению, проблема заключается в 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;
}

1 Ответ

0 голосов
/ 11 мая 2018

Ответ был таков: я забыл выделить память ...

#define pass_size 1000
 pass=calloc(pass_size,sizeof(char));
...