Ir ao conteúdo
  • Cadastre-se

leoo_teixeira

Membro Júnior
  • Posts

    3
  • Cadastrado em

  • Última visita

Reputação

3
  1. @devair1010 Poderia me dar um exemplo no meu caso, de como eu poderia colocar esses dados em vetores ? Eu preciso colocar em vetor o valor do salt, senha e login(esses dados já estão no arquivo binário).
  2. @arfneto Segue meu código. Para Compilar use: gcc -o <arquivo_saida> <main.c> -lcrypt #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/random.h> //lib para obter uma série de bytes aleatórios (https://man7.org/linux/man-pages/man2/getrandom.2.html) #include <unistd.h> //função de criptografia de senha (https://man7.org/linux/man-pages/man3/crypt.3.html) #include <time.h> // #include <crypt.h> int main() { int tamanho_senha; char verificaLogin; int tamanho_arquivo = 0; FILE *dados; // Declarando um ponteiro(link para o endereço da memória) para o arquivo de dados: 'dados' int opcao; struct informacoes_usuarios { char login[10]; char senha[150]; char salt[32]; }; struct informacoes_usuarios user_cadastro, *cadastros; while (opcao != 3) { printf("\n 1 - Cadastrar nova conta\n"); printf(" 2 - Fazer login\n"); printf("\nEscolha uma Opcao: "); scanf("%d%*c", &opcao); switch (opcao) { //CASE 1 DE CADASTRO DE CONTAS case 1: dados = fopen("contas.db", "ab"); //Abre o arquivo novamente para leitura if (dados == NULL) { return 0; } else { memset(&user_cadastro, 0, sizeof(struct informacoes_usuarios)); printf("Escolha um ID: "); scanf("%s", user_cadastro.login); printf("Cadastre uma senha: "); scanf("%s", user_cadastro.senha); tamanho_senha = strlen(user_cadastro.senha); while (tamanho_senha < 7 | tamanho_senha >= 64) //verificacao de senha forte. O usuario tem que digitar no minimo 7 caraqueteres { printf("\n A senha nao é forte! \n\nDigite sua senha:"); scanf("%s", user_cadastro.senha); tamanho_senha = strlen(user_cadastro.senha); } printf("\nUSUÁRIO CADASTRADO!"); // pseudorandom number generator (mais seguro que o anterior) - PRNG_v2 size_t buffer_size = 32; char *buffer; int retorno; char valor_salt[64]; buffer = malloc(buffer_size); retorno = getrandom(buffer, buffer_size, 0); if (retorno != buffer_size) { perror("getrandom failed"); } // printf("Saída PRNG_v2 (unsigned char) = "); for (int indice = 0; indice < buffer_size; indice++) { // printf("%hhu ", buffer[indice]); } printf("\n"); char lista_caracteres2[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/"; // printf("Saída PRNG_v2 (char) = "); for (int indice = 0; indice < 32; indice++) { valor_salt[indice] = lista_caracteres2[((unsigned char)buffer[indice]) % (strlen(lista_caracteres2))]; } printf("\n"); char $[] = "$"; // FIM pseudorandom number generator (mais seguro que o anterior) - PRNG_v2 char valor_saltedHash[150] = "$6$rounds=20000$"; //verificar o tamanho printf("Valor do Salt = %s\n", valor_salt); strcat(valor_saltedHash, valor_salt); //concatenando valor do salt no saltedHash SHA512 strcat(valor_saltedHash, $); printf("Valor do SaltedHash = %s\n", valor_saltedHash); char *senha_com_hash = crypt(user_cadastro.senha, valor_saltedHash); //função crypt printf("RESULTADO A SER GRAVADO = %s\n", senha_com_hash); printf("Valor do salt do user = %s\n", valor_salt); strcpy(user_cadastro.senha, senha_com_hash); strcpy(user_cadastro.salt, valor_salt); printf("Valor da senha com hash + salt = %s\n", user_cadastro.senha); printf("Valor do salt = %s\n", user_cadastro.salt); printf("dados username = %s\n", user_cadastro.login); printf("dados senha = %s\n", user_cadastro.senha); fwrite(&user_cadastro, sizeof user_cadastro, 1, dados); fclose(dados); } break; //CASE 2 DE verificacao de login case 2: memset(&user_cadastro, 0, sizeof(struct informacoes_usuarios)); printf("USUARIO: "); scanf("%s", user_cadastro.login); printf("SENHA: "); scanf("%s", user_cadastro.senha); //INICIO verificação de arquivo-------------------------------------------------------------------- dados = fopen("contas.db", "rb"); if (dados == NULL) { return 0; //CASO DE ERRO AO LER O ARQUIVO RETORNA 0 E FECHA O SISTEMA. break; } else { fseek(dados, 0, SEEK_END); //permitir realizar operacoes de leitura e escrita. tamanho_arquivo = ftell(dados); int usuarios_contas; usuarios_contas = tamanho_arquivo / sizeof(struct informacoes_usuarios); rewind(dados); //VOLTANDO AO COMEÇO DO ARQUIVO cadastros = malloc(tamanho_arquivo); //alocando espaço para tamanho do arquivo na memória if (fread(cadastros, sizeof user_cadastro, usuarios_contas, dados) != usuarios_contas) { return 0; //CASO DE ERRO AO LER O ARQUIVO RETORNA 0 E FECHA O SISTEMA. break; } fclose(dados); int i; //FIM verificação de arquivo-------------------------------------------------------------------- for (i = 0; i < usuarios_contas; i++) { //coparando login e a senha(hash) com os valores no arquivo if (memcmp(&user_cadastro, &cadastros[i], sizeof(struct informacoes_usuarios)) == 0) //memcmp faz a comparacao da memoria com os valores digitados pelo usuário(login e senha) { printf("dados senha = %s\n", user_cadastro.salt); printf("\n VOCÊ ESTÁ LOGADO\n"); break; } } if (i == usuarios_contas) { printf("\nID ou Senha incorreta\n"); } } break; default: break; } } return 0; }
  3. Olá, Estou desenvolvendo um sistema de Autenticação com senhas, em que eu uso salted hash para armazenamento das senhas, com um valor de salt pseudoaleatório e o SHA512 como função hash; No arquivo que contém as senhas eu armazeno o salt em claro. E ai eu pego esse salt e preciso concatenar com a string digitada do usuário no momento que ele realiza o login, com a mesma lógica que fiz para gerar o hash original e no final apenas comparo com o hash armazenado. Se o hash IGUAL, USUARIO LOGADO. Minha dúvida está em, ler esse arquivo binário. Como faço para que a partir do login digitado pelo usuario o sistema busque o valor do salt correspondente a esse login no arquivo binário? O código: case 1: dados = fopen("contas.db", "ab"); //Abre o arquivo novamente para leitura if (dados == NULL) { return 0; } else { memset(&user_cadastro, 0, sizeof(struct informacoes_usuarios)); printf("Escolha um ID: "); scanf("%s", user_cadastro.login); printf("Cadastre uma senha: "); scanf("%s", user_cadastro.senha); tamanho_senha = strlen(user_cadastro.senha); while (tamanho_senha < 7 | tamanho_senha >= 64) //verificacao de senha forte. O usuario tem que digitar no minimo 7 caraqueteres { printf("\n A senha nao é forte! \n\nDigite sua senha:"); scanf("%s", user_cadastro.senha); tamanho_senha = strlen(user_cadastro.senha); } printf("\nUSUÁRIO CADASTRADO!"); // pseudorandom number generator (mais seguro que o anterior) - PRNG_v2 size_t buffer_size = 32; char *buffer; int retorno; char valor_salt[64]; buffer = malloc(buffer_size); retorno = getrandom(buffer, buffer_size, 0); if (retorno != buffer_size) { perror("getrandom failed"); } // printf("Saída PRNG_v2 (unsigned char) = "); for (int indice = 0; indice < buffer_size; indice++) { // printf("%hhu ", buffer[indice]); } printf("\n"); char lista_caracteres2[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/"; // printf("Saída PRNG_v2 (char) = "); for (int indice = 0; indice < 32; indice++) { valor_salt[indice] = lista_caracteres2[((unsigned char)buffer[indice]) % (strlen(lista_caracteres2))]; } printf("\n"); char $[] = "$"; // FIM pseudorandom number generator (mais seguro que o anterior) - PRNG_v2 char valor_saltedHash[150] = "$6$rounds=20000$"; //verificar o tamanho printf("Valor do Salt = %s\n", valor_salt); strcat(valor_saltedHash, valor_salt); //concatenando valor do salt no saltedHash SHA512 strcat(valor_saltedHash, $); printf("Valor do SaltedHash = %s\n", valor_saltedHash); char *senha_com_hash = crypt(user_cadastro.senha, valor_saltedHash); //função crypt printf("RESULTADO A SER GRAVADO = %s\n", senha_com_hash); printf("Valor do salt do user = %s\n", valor_salt); strcpy(user_cadastro.senha, senha_com_hash); strcpy(user_cadastro.salt, valor_salt); printf("Valor da senha com hash + salt = %s\n", user_cadastro.senha); printf("Valor do salt = %s\n", user_cadastro.salt); printf("dados username = %s\n", user_cadastro.login); printf("dados senha = %s\n", user_cadastro.senha); fwrite(&user_cadastro, sizeof user_cadastro, 1, dados); fclose(dados); } break; //CASE 2 DE verificacao de login case 2: memset(&user_cadastro, 0, sizeof(struct informacoes_usuarios)); printf("USUARIO: "); scanf("%s", user_cadastro.login); printf("SENHA: "); scanf("%s", user_cadastro.senha); //INICIO verificação de arquivo-------------------------------------------------------------------- dados = fopen("contas.db", "rb"); if (dados == NULL) { return 0; //CASO DE ERRO AO LER O ARQUIVO RETORNA 0 E FECHA O SISTEMA. break; } else { fseek(dados, 0, SEEK_END); //permitir realizar operacoes de leitura e escrita. tamanho_arquivo = ftell(dados); int usuarios_contas; usuarios_contas = tamanho_arquivo / sizeof(struct informacoes_usuarios); rewind(dados); //VOLTANDO AO COMEÇO DO ARQUIVO cadastros = malloc(tamanho_arquivo); //alocando espaço para tamanho do arquivo na memória if (fread(cadastros, sizeof user_cadastro, usuarios_contas, dados) != usuarios_contas) { return 0; //CASO DE ERRO AO LER O ARQUIVO RETORNA 0 E FECHA O SISTEMA. break; } fclose(dados); int i; //FIM verificação de arquivo-------------------------------------------------------------------- for (i = 0; i < usuarios_contas; i++) { //coparando login e a senha(hash) com os valores no arquivo if (memcmp(&user_cadastro, &cadastros[i], sizeof(struct informacoes_usuarios)) == 0) //memcmp faz a comparacao da memoria com os valores digitados pelo usuário(login e senha) { printf("dados senha = %s\n", user_cadastro.salt); printf("\n VOCÊ ESTÁ LOGADO\n"); break; } } if (i == usuarios_contas) { printf("\nID ou Senha incorreta\n"); } } break; default: break; } } return 0; }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...