É 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 ;)
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.