Ir para conteúdo
Fórum Script Brasil
  • 0

Linguagem C - Acho que é com o strcmp


Blitzen

Pergunta

É um trabalho da faculdade em C em que tenho que fazer a autenticação de usuários com o crypt() e o MD5. Quando tento comparar as strings armazenadas no arquivo e a calculada com a senha fornecida pelo usuário, mesmo passando os dados corretos, o código não consegue "autenticar", isto é, ele compara as strings iguais e diz que são diferentes. Pelamordedeus, alguém me dê uma luz, porque não consigo achar a m&*#@ do erro. Vlw.

ps: para compilar, acrescente -lcrypt ;)

/*
 * CABEÇALHOS
 */
#include <stdio.h> /* getchar(), fgets() */
#include <stdlib.h> /* system() */
#include <unistd.h> /* crypt(), getpass() */
#include <string.h> /* strlen(), strcpy(), strcat() */
#include <errno.h> /* perror() */
#include <time.h> /* time() */

/*
 * DEFINIÇÕES
 * */
#define     TAM_SENHA        30
#define        TAM_SALT        15
#define        TAM_MAX            50
#define        TAM_BUF            1024
#define        SIM                1
#define        não                0

/* simulando o tipo booleno */
typedef enum Boolean{
    false=0, true=1
} bool;

/*
 * PROTÓTIPOS
 */
void menuPrincipal();
void concatenar( char *buffer, char *nome, char *login, char *senhaHash );
void guardarSenha( char *buffer );
void cadastrar();
void autenticar();
void colherDados( char *nome, char *login, char *senhaTextoClaro, int autenticacao );
void verificarSeCadastrado( char* loginDigitado, char* senhaHash, bool *status );
int compara( const char* str1, const char* str2 );
void listar();

int main()
{
    /* chama o menu principal */
    menuPrincipal();
    
    return(0);
}

int compara( const char* str1, const char* str2 )
{
    for(; *str1 == *str2; ++str1, ++str2 ){
        if( *str1 == '' )
            return 0;
    }

    return ((*(unsigned char*)str1 < *(unsigned char*)str2)? -1 : +1);
}

/* Menu principal */
void menuPrincipal()
{
    char opcao;
    
    do
    {
        do
        {
            system( "clear" );
            printf( "Autenticacao de usuarios e senhas\n" );
            printf( "1. Cadastrar usuario\n" );
            printf( "2. Autenticar\n" );
            printf( "3. Listar passwd.conf\n" );
            printf( "5. Sair\n" );
            printf( "> " );
            fflush( stdin );
            fflush( stdin );
            scanf( "%c", &opcao );
            getchar();
            fflush( stdin );

            if( opcao < '1' || opcao > '5' )
            {
                printf( "Opcao invalida!" );
                getchar();
            }
        } while( opcao < '1' || opcao > '5' );
        
        switch( opcao )
        {
            case '1':
                cadastrar();
                break;
            case '2':
                autenticar();
                break;
            case '3':
                listar();
                getchar();
                break;
            case '5':
                break;
        }
    } while( opcao != '5' );
}

/* autentica usuário e senha */
void autenticar()
{
    char senhaTextoClaro[TAM_SENHA]; /* senha que será recolhida */
    char senhaHash[TAM_MAX]; /* senha recuperada do arquivo passwd.conf */
    char *senhaHashCalculada; /* hash calculado com a senha digitada */
    char salt[TAM_SALT]; /* salt number */
    int i, valor;
    char nome[TAM_MAX]; /* nome digitado */
    char login[TAM_MAX]; /* login digitado */
    bool status = false; /* guarda o retorno de vericaSeCadastrado, true significa que já existe */
    

    colherDados( nome, login, senhaTextoClaro, não );

    verificarSeCadastrado( login, senhaHash, &status );

    if( status == true )
    {
        getchar();

        /* "pegar" o salt number do hash guardado em arquivo */
        salt[0] = '$';
        salt[1] = '1';
        salt[2] = '$';
        for( i=0; i<8; i++ )
        {
            salt[i+3] = senhaHash[i+3];
            salt[i+4] = '';
        }

        /* calcula o hash com a senha digitada */
        senhaHashCalculada = (char *) crypt(senhaTextoClaro, salt);

        valor = compara( senhaHash, senhaHashCalculada );

        if( valor == 0 )
        {
            printf( "Usuario cadastrado\n" );
            getchar();
        }
        else
        {
            printf( "Usuario ou senha incorretos\n%d\n", valor );
            getchar();
        }
    }
    else
    {
        printf( "\nUsuario não cadastrado!\n" );
        getchar(); getchar();
    }
}

/* Cadastra novos usuários */
void cadastrar()
{
    char senhaTextoClaro[TAM_MAX]; /* senha que será recolhida */
    char *senhaHash; /* hash da senha digitada */
    char salt[TAM_SALT]; /* salt number */
    char i;
    char nome[TAM_MAX];
    char login[TAM_MAX];
    char buffer[TAM_BUF];
    /* Na hora de sortear os caracteres de salt number, apenas os caracteres
     *  válidos serão usados */
    char saltValidos[] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuwxyz0123456789./";
    char saltValidosTam = strlen(saltValidos);
    int spos;

    /* Colher os dados do novo usuário */
    colherDados( nome, login, senhaTextoClaro, SIM );

    /* Disparando uma semente de números randômicos */
    srand(time(NULL));

    /* Sorteando aleatoriamente caracteres do salt number */
    salt[0] = '$';
    salt[1] = '1'; /* indica que é o MD5 */
    salt[2] = '$';
    for (i = 0; i < 8; i++) {
          spos = random() % saltValidosTam;
          salt[i + 3] = saltValidos[spos];
          salt[i + 4] = '';   /* fechando a string */
          srand(random());
    }

    getchar();
    
    /* calcula o hash utilizando o MD5 */
    senhaHash = (char *) crypt(senhaTextoClaro, salt);

    /* concatena as strings nome, login e hash no formato definido */
    concatenar( buffer, nome, login, senhaHash );
    
    /* guarda a senha no arquivo passwd.conf */
    guardarSenha( buffer );

}

/* Colhe os dados do novo usuário */
void colherDados( char *nome, char *login, char *senhaTextoClaro, int autenticacao )
{
    /* Colher dados */
    if( autenticacao == SIM )
    {
        printf( "Nome: " );
        fflush( stdin );
        scanf( "%s", nome );
    }

    printf( "Usuario: " );
    fflush( stdin );
    scanf( "%s", login );

    strcpy( senhaTextoClaro, getpass( "Senha: " ) );

}


/* concatena as strings nome, login e hash no formato definido */
void concatenar( char *buffer, char *nome, char *login, char *senhaHash )
{
    strcpy( buffer, nome );
    strcat( buffer, ":" );
    strcat( buffer, login );
    strcat( buffer, ":" );
    strcat( buffer, senhaHash );
}

/* armazena a string com o nome, login e senha no arquivo */
void guardarSenha( char *buffer )
{
    FILE *arq;

    /* tenta abrir o arquivo para guardar a string */
    if( (arq = fopen( "passwd.conf", "a" )) == NULL )
    {
        perror( "fopen" );
        return;
    }
    else
    {
        fprintf( arq, "%s \n", buffer );
        fclose( arq );
    }
}

/* função que verifica se um usuario consta no arquivo passwd.conf */
void verificarSeCadastrado( char* loginDigitado, char* senhaHash, bool *status )
{
    /* declaração de variáveis */
    FILE *arq;
    char buf[TAM_BUF];
    char *nome, *login, *senha;

    /* verifica se houve sucesso na abertura do arquivo */
    if( (arq = fopen( "passwd.conf", "r" )) == NULL )
    {
        perror( "fopen" );
        return;
    }
    else
    {
        /* extrai a primeira linha do arquivo */
        fgets( buf, TAM_BUF, arq );
        while(!feof(arq))
        {
            /* extrai as substrings delimitadas por ":" */
            nome = strtok( buf, ":" ); /* nome do usuário */
            login = strtok( NULL, ":" ); /* login */
            senha   = strtok( NULL, ":" ); /* hash */

printf( "%s", senha );

            /* verifica se achou o login do usuário */
            if( strcmp(login, loginDigitado) == 0 )
            {
                *status = true;
                strcpy( senhaHash, senha );
                fclose(arq);
                return;
            }

            /* caso não tenha encontrado o usuário, extrai-se a próxima linha do arquivo */
            fgets( buf, TAM_BUF, arq );
        }
        fclose(arq);
    }
} /* fim da função verificarSeCadastrado() */

/* função que verifica se um usuario consta no arquivo passwd.conf */
void listar()
{
    /* declaração de variáveis */
    FILE *arq;
    char buf[TAM_BUF];

    /* verifica se houve sucesso na abertura do arquivo */
    if( (arq = fopen( "passwd.conf", "r" )) == NULL )
    {
        perror( "fopen" );
        return;
    }
    else
    {
        /* extrai a primeira linha do arquivo */
        fgets( buf, TAM_BUF, arq );
        while(!feof(arq))
        {
            printf( "%s", buf );

            /* caso não tenha encontrado o usuário, extrai-se a próxima linha do arquivo */
            fgets( buf, TAM_BUF, arq );
        }
        fclose(arq);
    }
} /* fim da função verificarSeCadastrado() */

Editado por Blitzen
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...