PRG1-2018-1-Sistema-Validação-Senha
Título
Requisitos
- diferenciar maiúscula de minuscula;
- permitir símbolos (definir subconjunto)
- permitir números
- senha sempre começa com letra
- mínimo de 6 caracteres e máximo de 25;
- teste de combinações da palavra do dicionário.
Texto Descritivo do Projeto
O projeto do sistema validação de senha tem intuito de fazer uma verificação da senha de um usuário podendo ser uma senha boa ou senha ruim fazendo comparação com o arquivo de palavras existentes que o programa possui.o programa inicia pedindo dados do usuário como: nick_usuario,senha e para qual motivo esta tentando verificar a senha. Depois de pegar os dados do usuário que esta fazendo verificação do qualidade da senha, o programa irá realizar manipulações com a senha recebida do usuário, para poder obter uma senha que será comparada com as palavras existentes no arquivo do programa. Se a senha existir no arquivo de palavras do programa irá retornar que a senha é fraca, se a senha não existir no arquivo de palavras do programa então ela retornará que a senha é forte e será armazenada em um ranking de senhas onde irá mostrar qual a senha mais forte atual e para que motivo ela foi usada o programa.
Código Fonte Comentado
- include <stdio.h>
- include <stdlib.h>
- include <string.h>
- include <unistd.h>
char *subs_n_s(char *alfa) // Função que realiza substituições de caracteres e números existentes em alfa.
{
char string[50]; //Declaração de variáveis utilizadas na função subs_n_s.
char senha0[50];
char senha_aux[50];
int i=0,k=0;
while (alfa[i] != 0){ //Loop que realiza verificação de caracteres ou números. Caso existam serão substituidos por "barspace".
if (alfa[i] == '!' || alfa[i] == '@'|| alfa[i] == '#' || alfa[i] == '$' || alfa[i] == '%' || alfa[i] == '"' || alfa[i] == '*' || alfa[i] == '(' || alfa[i] == ')' || alfa[i] == '_' || alfa[i] == '-'||alfa[i] == '1' || alfa[i] == '2'|| alfa[i] == '3' || alfa[i] == '4' || alfa[i] == '5' || alfa[i] == '6' || alfa[i] == '7' || alfa[i] == '8' || alfa[i] == '9' || alfa[i] == '0'||alfa[i] == '&'||alfa[i] == '+'||alfa[i] == '='||alfa[i] == '.'||alfa[i] == ','||alfa[i] == ';'){
alfa[i] = ' ';
}
i++;
}
strcpy(string,alfa); //copia o conteudo de alfa para variável string.
for(i=0; i<strlen(string); i++) //Loop que faz com que os "barspace" dentro da string sejam retirados.
{
if(string[i]=='\0')break;
if(string[i]==' ')continue;
senha_aux[k]=string[i];
k++;
}
strcpy(alfa,senha_aux); //Retorno do conteudo para alfa sem "barspace".
return alfa;
}
char *reverse( char *s ) //Função realiza inversão de caracteres do sentido trás para frente.
{
int lg = strlen(s) ; //Declaração de variavéis da função reverse.
int c,i,j;
for (i = 0, j = lg - 1; i < j; i++, j--) //Loop realiza inversão nas posições da string de trás para frente.
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
return s;
}
void vef1(char *beta) //Função que realiza a primeira verificação se beta existe ou não no arquivo palavras e realizando uma contagem.
{
char ch[50]; //Declaração de variáveis na função vef1.
int u;
int ct=0;
char file_palavras[100]= "/home/jefferson/Downloads/palavras";
FILE *file;
file = fopen(file_palavras, "r"); //Abre arquivo file em modo leitura.
if (file == NULL) //Condicional para verificar se houve erro na abertura do arquivo.
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
while((fscanf(file,"%s",ch) != EOF)) //Loop que realiza leitura do arquivo palavras.
{
u=strcmp(ch,beta); //Comparação de strings entre beta e arquivo.
if (u==0)
{
ct = ct + 1; //Contador de quantas vezes beta é encontrado no arquivo palavras.
}
}
fclose(file); //Fechar arquivo file.
printf("número de vezes que a senha foi encontrada pela primeira verificação: %d\n",ct);
}
void vef2(char *gama) //Função que realiza a segunda verificação se gama existe ou não no arquivo palavras e realizando uma contagem.
{
char ch[50]; //Declaração de variáveis utilizadas na função.
int d;
int ct=0;
char file_palavras[100]= "/home/jefferson/Downloads/palavras";
FILE *file;
file = fopen(file_palavras, "r");
if (file == NULL) //Condicional para verificar se houve erro na abertura do arquivo.
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
while((fscanf(file,"%s",ch) != EOF)) //Loop que realiza Leitura do arquivo palavras.
{
d=strcmp(ch,reverse(gama)); //Comparação entre o arquivo palavra e o reverso da string gama.
if (d==0)
{
ct = ct + 1; //Contador de quantas vezes gama é encontrado no arquivo palavras.
}
}
fclose(file);
printf("Número de vezes que a senha foi encontrada pela segunda verificação: %d\n",ct);
}
extern void PermutaString(char *, int, int );
extern void ArmazenaPermutacoes(char*);
FILE *out; //Variável out global.
void vef3(char *delta) //Função que realiza a terceira verificação se delta existe ou não no arquivo palavras e realizando uma contagem.
{
char senhap[50];
char ch[50];
int c;
int ct=0;
char file_palavras[100]= "/home/jefferson/Downloads/palavras";
FILE *file;
file = fopen(file_palavras, "r");
if (file == NULL) //Condicional para verificar se houve erro na abertura do arquivo.
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
out = fopen("permuta.txt", "w"); //Abre out em modo escrita.
PermutaString(delta, 0, strlen(delta)-1); //Chamada função permuta para delta.
fclose(out); //Fecha arquivo out.
out= fopen("permuta.txt", "r"); //Abre arquivo em modo leitura.
while((fscanf(out,"%s",senhap) != EOF))
{ //Loop que realiza leitura do arquivo out.
}
while((fscanf(file,"%s",ch) != EOF))
{ //Loop que realiza leitura do arquivo file.
c=strcmp(ch,senhap); //comparação entre arquivos.
if (c==0){
ct = ct + 1;
}
}
fclose(file); //Fecha arquivo file.
fclose(out); //Fecha arquivo out.
printf("Número de vezes que a senha foi encontrada pela terceira verificação: %d\n",ct);
}
void PermutaString( char *str, int k, int n ) //Função que realiza permutação de string.
{
int i; //Declaração de variáveis da função PermutaString.
char aux[10000],
c; //Armazena um caracter.
if ( k == n ) { //Armazena permutação.
ArmazenaPermutacoes(str);
return;
}
strcpy(aux, str);
for ( i = k; i <=n; i++ )
{ //Loop que permuta o caracter k-ésimo de str com o caracter i-ésimo de str.
c = str[k];
str[k] = str[i];
str[i] = c;
PermutaString(str, k+1, n);
strcpy(str,aux);
}
}
void ArmazenaPermutacoes(char *str) //Função que armazena permutações.
{
fputs(str, out);
fputs("\n",out);
}
struct TDados{ //struct com variáveis.
char nick_usuario[50];
char senha[50];
char uso_da_senha[50];
};
void ler_dados(struct TDados aux) //Função que lê dados.
{
printf("==========DADOS LIDOS==========\n");
printf("Nick do usario:%s\n",aux.nick_usuario);
printf("Uso da senha:%s\n",aux.uso_da_senha);
}
int main()
{
struct TDados dados;
char *password; //Variáveis da função main.
int ver_senha;
printf("==========ESCREVA SEUS DADOS==========\n");
printf("Digite o nick do seu usario: ");
scanf("%[^\n]", dados.nick_usuario);
printf("Digite o motivo a qual irá usar a senha: ");
scanf("%s",dados.uso_da_senha);
printf("Para captura de caracteres especiais apenas os de 1 a 9 do teclado exceto disso o programa não irá ser exucutado\n");
password = getpass("Digite a senha para verifiação se ela é forte: ");
ler_dados(dados); //chamada da função ler_dados.
strcpy(dados.senha,password);
subs_n_s(dados.senha); //Chamada função subs_n_s.
vef1(dados.senha); //Chamada função vef1.
vef2(dados.senha); //Chamada função vef2.
vef3(dados.senha); //Chamada função vef3.
printf("Deseja ver sua senha?...1 para sim , 2 para não\n");
scanf("%d",&ver_senha);
if (ver_senha == 1)
{
printf("%s\n",password);
}
else if(ver_senha == 2)
{
printf("Programa encerrado...\n");
}
else
{
printf("Comando não encontrado,reinicie o programa...\n");
}
}
</syntaxhighlight>