Autenticação em C

figboy

I folded Myself
Boa noite a todos. Tenho de fazer uma função para fazer login de um utilizador e tenho de usar ficheiros para guardar a informação dos utilizadores.

Sendo assim a minha ideia seria ter uma pasta em que cada ficheiro tem o como nome o próprio nome do utilizador e dentro desse ficheiro tinha a sua password.

A primeira coisa que estava a pensar fazer é abrir o diretório onde estão os ficheiros dos utilizadores e verificar se existe algum ficheiro com o nome de utilizador que foi introduzido ao fazer login.

O código que fiz foi este, mas está me a dar o erro "Falha de segmentação (imagem do núcleo gravada)", já percebi de onde vem o erro, é no caminho do opendir. Se eu puser o caminho completo já não dá erro. Contudo eu não queria colocar o caminho completo, queria colocar o caminho apenas a partir de onde tenho o executável para conseguir que o programa funcione em qualquer pc, há maneira de fazer isto?. Para além disso não estou a conseguir fazer o que pretendo, mas não estou a ver como o fazer.
Código:
int login()
{
    char user[20], pass[20];
    printf("utilizador:"); //nome de utilizador
    scanf("%s", &user);
   
    printf("Password:");
    scanf("%s", pass);  //password do utilizador
   
    DIR *acesso;
    struct dirent *d;
    acesso = opendir("Projeto/Login/Administradores");
   
    while ( (d =readdir(acesso)) != NULL){
        if ((d==user){
            printf("User encontrado");
        }
        else {
            printf("User não encontrado");
        }
       
                }
     
}


Se alguém me conseguir dar umas luzes sobre isto agradeço imenso.

Cumps
 
Experimenta:
Código:
    acesso = opendir("./Projeto/Login/Administradores");

Podes tb verificar a razão do erro verificando o errno:
Código:
    acesso = opendir("./Projeto/Login/Administradores");
    if (!acesso)
        printf("Erro no opendir: %s\n", strerror(errno));

Listagem dos erros em:
https://linux.die.net/man/3/opendir
 
@xBoShY Obrigado já consegui fazer essa parte. Mas não estou a conseguir fazer bem a comparação do que foi escrito pelo usuario com os ficheiros que tenho. Consegues ajudar?
Código:
int login()
{
    char user[20], pass[20];
    printf("utilizador:"); //nome de utilizador
    scanf("%s", &user);
   
    printf("Password:");
    scanf("%s", pass);  //password do utilizador
   
    DIR *acesso;
    struct dirent *entry;
    acesso = opendir("../Projeto/Login/Administradores");
   
    if(!acesso){
        printf("Erro no opendir: %s\n", strerror(errno));
    }
   
    while ( (entry=readdir(acesso)) != NULL){
        if (strcmp(entry->d_name, user)==0){
            printf("User encontrado");
        }
        else {
            printf("User não encontrado");
        }
       
                } 
}
 
Experimenta escrever as comparações no ecrã:
Código:
    while ( (entry=readdir(acesso)) != NULL){
         printf("%s == %s => ", entry->d_name, user);
        if (strcmp(entry->d_name, user)==0){
            printf("User encontrado\n");
        }
        else {
            printf("User não encontrado\n");
        }
   }
 
Obrigado @xBoShY , entretanto devido ao conselho do meu professor mudei um pouco a estratégia e ficou assim :


Código:
int login() //função para login
{
  char  user[20], path_user[80], pass[20], pass1[20],passtemp[20];
  char passaux[]="password";
 
 
    printf("utilizador:"); //nome de utilizador
    scanf("%s", user);
   
   
   
   
    sprintf(path_user, "../Projeto/Login/Administradores/%s" ,user);
   
    usuario = fopen(path_user,"r+");
   
       
        if(usuario==NULL){
        printf("User não encontrado\n");
        system("clear");
        menu();
       
       
    }
   
        else {
            printf("Password:"); //Password do user
            scanf("%s", pass);
           
            fscanf(usuario, "%s", pass1); //abre o ficheiro com a pass
                       
            if(strcmp(pass1,pass)==0){                 //compara a pass do ficheiro com a pass inserida
                    menu_servidor();
                   
                }
                else{
                    printf("Palavra passe errada, tente outra vez\n"); 
                   
                    menu();
                   
                    }
    }
}
 
Vou dar uma sugestão, conheces a máquina Enigma?
É provável a maneira mais simples de não teres a password em plain text num ficheiro sem usares uma biblioteca à parte, misturas os caracteres todos da password de forma a não conseguirem decifra-la e só o programa consegue decifrar, isto não é a melhor solução já que não precisas de decifrar, só precisas que a hash criada da password original seja igual à hash da password colocada na autenticação.

Não sei se o professor vai dar algum bónus, mas vê-se muitos recém-licenciados e recém-mestrados a guardarem passwords em plain text, começares por perceber que isso não se deve fazer é um importante passo.
 
Obrigado pela opinião @anjo2 e concordo que não é de maneira nenhuma uma boa prática guardar palavras passes em ficheiros de texto. No entanto este é o primeiro projeto que estamos a desenvolver e pelo que percebi os professores não quiseram complicar esta parte. Acredito que mais tarde teremos de ter em atenção os aspetos de segurança
 
Back
Topo