Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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