É 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() */
Pergunta
Blitzen
É 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 BlitzenLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.