Ir ao conteúdo
  • Cadastre-se

leoo_teixeira

Membro Júnior
  • Posts

    3
  • Cadastrado em

  • Última visita

posts postados por leoo_teixeira

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

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

     

    • Curtir 1
  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;
    }

     

    • Curtir 1

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!