Jump to content
  • Sign Up

C Autenticacão com C - Hash e Salt. Como ler arquivo binario e comparar o hash


leoo_teixeira
 Share

Recommended Posts

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;
}

 

  • Curtir 1
Link to comment
Share on other sites

@leoo_teixeira    trabalhar com arquivos , é complicado , e ainda mais usando esse fseek para controlar o ponteiro dentro do arquivo , e seria melhor você pegar os dados que estão no arquivo e colocar eles em vetores , e ou até mesmo struct , onde se pode ler cada bloco da struct de uma vez só , e depois faça as comparações da senha e login com o que está armazenado nos vetores e concatenando os dados do jeito que você quer .

  • Curtir 1
Link to comment
Share on other sites

@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;
}

 

  • Curtir 1
Link to comment
Share on other sites

@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). 

Em 14/06/2021 às 00:07, leoo_teixeira disse:

@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;
}

 

 

  • Curtir 1
Link to comment
Share on other sites

@leoo_teixeira     se a struct for um vetor com várias posições ,   você no início abre o arquivo e lê os dados inserindo na struct e fazendo a contagem da quantidade de cadastros já existem no arquivo ,  e assim esse contador irá apontar para a próxima posição na struct e então poderá gravar outros dados ,  e durante o decorrer do programa você insere outros dados  e faz pesquisas e lista o que foi cadastrado usando a struct , e no final na hora de sair do programa abre o arquivo com o "wb"   para resetar todo o arquivo e  grava toda a struct , que nesse ponto já foi editada ou modificada , no arquivo .  e esse seu código poderia ser assim  :

#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>
#define cls system("cls");
#define tecle system("pause");
// #include <crypt.h>
int getrandom();
int main()
{
    int tamanho_senha;
    char verificaLogin;
    int tamanho_arquivo = 0;
    int indice,contador=0,i;
    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[100], *cadastros;

    //  ler o arquivo e colocar os dados na struct
    dados = fopen("contas.db","rb");
    if(dados == NULL)
        dados = fopen("contas.db","wb");
    while(fread(&user_cadastro[contador], sizeof(struct informacoes_usuarios), 1, dados) > 0 )/*aqui pega do arquivo e coloca no struct mesmo*/
        contador++;
    fclose(dados);
    printf("\tExite %d Usuarios cadastrados\n",contador);
    tecle
    do
    {
        cls
        printf("\n");
        printf(" 0 - Listar Tudo\n");
        printf(" 1 - Cadastrar nova conta\n");
        printf(" 2 - Fazer login\n");
        printf(" 3 - Sair Do Programa\n");
        printf("     Escolha uma Opcao: ");
        scanf("%d%*c", &opcao);
        switch( opcao )
        {
        case 0:
            printf("\t\t\t\tmostrando todo o cadastro\n");
            for(i=0; i<contador; i++)
            {
                printf("\
                        \t-------------------------------\n\
                        \tLogin --: %s\n\
                        \tSenhA --: %s\n\
                        \tSaLt ---: %s\n",
                        user_cadastro[i].login,
                        user_cadastro[i].senha,
                        user_cadastro[i].salt
                      );
            }
            printf("\n\n");
            system("pause");
            break;
        //CASE 1 DE CADASTRO DE CONTAS
        case 1:
                //memset(&user_cadastro, 0, sizeof(struct informacoes_usuarios));
                printf("Escolha um ID: ");
                scanf("%s", user_cadastro[contador].login);
                printf("Cadastre uma senha: ");
                scanf("%s", user_cadastro[contador].senha);
                tamanho_senha = strlen(user_cadastro[contador].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[contador].senha);
                    tamanho_senha = strlen(user_cadastro[contador].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 (indice = 0; indice < buffer_size; indice++)
                {
                    // printf("%hhu ", buffer[indice]);
                }
                printf("\n");
                char lista_caracteres2[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/";
                // printf("Saída PRNG_v2 (char) = ");
                for( 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 = "qualquer coisa";//crypt(user_cadastro[contador].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[contador].senha, senha_com_hash);
                strcpy(user_cadastro[contador].salt, valor_salt);
                printf("Valor da senha com hash + salt = %s\n", user_cadastro[contador].senha);
                printf("Valor do salt = %s\n", user_cadastro[contador].salt);
                printf("dados username = %s\n", user_cadastro[contador].login);
                printf("dados senha = %s\n", user_cadastro[contador].senha);
                contador++;
            break;
        //CASE 2 DE verificacao de login
        case 2:
            memset(&user_cadastro, 0, sizeof(struct informacoes_usuarios));
            printf("USUARIO: ");
            scanf("%s", user_cadastro[contador].login);
            printf("SENHA: ");
            scanf("%s", user_cadastro[contador].senha);
            //INICIO verificação de arquivo--------------------------------------------------------------------
            dados = fopen("contas.db", "rb");
            if (dados == NULL)
            {
                printf("nao existe arquivo com esse nome ( contas.db )");
                system("pause");
                return 0; //CASO DE ERRO AO LER O ARQUIVO RETORNA 0 E FECHA O SISTEMA.
            }
            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
//                Head = malloc(max*sizeof(struct Musicas));
                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.
                }
                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[contador].salt);
                        printf("\n VOCÊ ESTÁ LOGADO\n");
                        break;
                    }
                }
                if (i == usuarios_contas)
                {
                    printf("\nID ou Senha incorreta\n");
                }
            }
            break;
        case 3:
            printf("\n\n\t\tSaindo domPrograma . . . !\n\n");
            dados = fopen("contas.db", "wb"); //   grava toda a struct no arquivo
            for(i=0; i<contador; i++)
            {
                fwrite(&user_cadastro, sizeof (struct informacoes_usuarios), 1, dados);
            }
            fclose(dados);
            break;
        default:
            printf("Opcao iNvaLidA . . . !\n");
        }
    }while( opcao != 3 );
    return 0;
}
int getrandom()
{
    int x;
    rand () %100+1;
    return x;
}

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

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

×
×
  • Create New...

Redes-Wi-Fi-capa-3d-newsletter.png

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!