Use a função crypt em C

Jinku Hu 12 outubro 2023
  1. Use a função crypt para fazer o hash de frases secretas para armazenamento
  2. Use rotinas estritas de tratamento de erros para garantir a execução bem-sucedida das funções crypt
Use a função crypt em C

Este artigo irá explicar vários métodos de como usar a função crypt em C.

Use a função crypt para fazer o hash de frases secretas para armazenamento

crypt é na verdade uma família de quatro funções que fornecem os métodos de hash de frase-senha para armazenamento no sistema ou autenticação. Observe que essas funções não são adequadas para hashing criptográfico de uso geral, já que o hashing de frase secreta precisa ser caro do ponto de vista computacional em comparação com os de uso geral projetados para ser rápidos e usar menos poder de processamento.

crypt recebe dois argumentos char* passados como parâmetros qualificados const. O primeiro argumento aponta para a senha que precisa ser hash, e o segundo é a string especial chamada setting, que deve ser gerada usando a função crypt_gensalt. O argumento setting fornece vários parâmetros para a função crypt, como qual algoritmo de hash usar, o custo computacional do hash (o maior valor corresponde ao mais caro) e bytes de sal aleatórios. Observe que os bytes para salt devem ser criptograficamente aleatórios e podem ser obtidos separadamente dos utilitários de geração de números aleatórios específicos do sistema. O exemplo a seguir demonstra o caso em que o valor especial - ponteiro nulo é passado para crypt_gensalt como o terceiro parâmetro para indicar a recuperação automática de bytes aleatórios.

Existem vários algoritmos hash disponíveis (totalmente detalhados nesta página), e eles são passados ​​como identificadores de string exclusivos para a função crypt_gensalt. Uma vez que crypt_gensalt retorne a string setting, ela pode ser passada para a função crypt junto com a frase-senha, e o valor de retorno será a frase-senha hash que é um texto ASCII imprimível. Usamos o algoritmo bcrypt identificado como cadeia de prefixo "$2b$" no próximo código de amostra. Observe que o segundo argumento da função crypt_gensalt especifica quão cara a geração de hash deve ser com o valor 0 especificando o nível padrão do algoritmo fornecido. Nesse caso, especificamos 15, que é o valor recomendado para o algoritmo de hash bcrypt.

#include "crypt.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

enum { MAX_LEN = 1024 };

int main(int argc, char *argv[]) {
  char *text, *encrypted, *salt;
  size_t len;
  long lnmax;

  text = malloc(MAX_LEN);

  printf("Input string to be hashed: ");
  if (fgets(text, MAX_LEN, stdin) == NULL) exit(EXIT_FAILURE);

  len = strlen(text);
  if (text[len - 1] == '\n') text[len - 1] = '\0';

  salt = crypt_gensalt("$2b$", 15, NULL, 0);
  encrypted = crypt(text, salt);

  printf("Encrypted: %s", encrypted);

  free(text);
  exit(EXIT_SUCCESS);
}

Resultado:

Input string to be hashed: hello there
Encrypted: $2b$15$DkpZq2vJRQoBiK4slxfFa.Eml8PUtFB7CYYH1RJH6XML3ujhX8fqy

Use rotinas estritas de tratamento de erros para garantir a execução bem-sucedida das funções crypt

O código do exemplo anterior pega a string de entrada do usuário e aloca memória dinâmica para armazená-la. Portanto, precisamos garantir que a string seja lida sem quaisquer caracteres restantes no buffer stdio. Para isso, chamamos fflush em stdout e, em seguida, chamamos fgets para obter a string de entrada do usuário. Além disso, verifique todas as funções da biblioteca e chamadas do sistema para seus valores de retorno de erro e chame perror para gerar a mensagem correspondente.

#include "crypt.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

enum { MAX_LEN = 1024 };

int main(int argc, char *argv[]) {
  char *text, *encrypted, *salt;
  size_t len;
  long lnmax;

  text = malloc(MAX_LEN);
  if (text == NULL) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  printf("Input string to be hashed: ");
  fflush(stdout);
  if (fgets(text, MAX_LEN, stdin) == NULL) exit(EXIT_FAILURE);

  len = strlen(text);
  if (text[len - 1] == '\n') text[len - 1] = '\0';

  salt = crypt_gensalt("$2b$", 15, NULL, 0);
  if (salt == NULL) {
    perror("crypt_gensalt");
    exit(EXIT_FAILURE);
  }

  encrypted = crypt(text, salt);
  if (encrypted == NULL) {
    perror("crypt_gensalt");
    exit(EXIT_FAILURE);
  }

  printf("Encrypted: %s", encrypted);

  free(text);
  exit(EXIT_SUCCESS);
}

Resultado:

Input string to be hashed: hello there
Encrypted: $2b$15$DkpZq2vJRQoBiK4slxfFa.Eml8PUtFB7CYYH1RJH6XML3ujhX8fqy
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook