Utilice la función crypt en C

Jinku Hu 12 octubre 2023
  1. Utilice la función cripta para hacer hash de frases de contraseña para el almacenamiento
  2. Utilice estrictas rutinas de manejo de errores para garantizar la ejecución exitosa de las funciones crypt
Utilice la función crypt en C

Este artículo explicará varios métodos de cómo utilizar la función crypt en C.

Utilice la función cripta para hacer hash de frases de contraseña para el almacenamiento

crypt es en realidad una familia de cuatro funciones que proporcionan los métodos de hash de frase de contraseña para el almacenamiento en el sistema o la autenticación. Tenga en cuenta que estas funciones no son adecuadas para el hash criptográfico de propósito general, ya que el hash de la frase de contraseña debe ser computacionalmente costoso en comparación con los de propósito general diseñados para ser rápidos y utilizar menos potencia de procesamiento.

crypt toma dos argumentos char* pasados ​​como parámetros calificados const. El primer argumento apunta a la frase de contraseña que necesita ser hash, y el segundo es la cadena especial llamada setting, que debe generarse usando la función crypt_gensalt. El argumento setting proporciona múltiples parámetros para la función crypt, como qué algoritmo hash usar, el costo computacional del hash (el valor más grande corresponde al más costoso) y bytes salt aleatorios. Tenga en cuenta que los bytes de salt deben ser criptográficamente aleatorios y se pueden obtener por separado de las utilidades de generación de números aleatorios específicos del sistema. El siguiente ejemplo demuestra el caso en el que el valor especial - puntero nulo se pasa a crypt_gensalt como tercer parámetro para indicar la recuperación automática de bytes aleatorios.

Hay varios algoritmos hash disponibles (completamente detallados en esta página), y se pasan como identificadores de cadena únicos a la función crypt_gensalt. Una vez que crypt_gensalt devuelve la cadena de configuración, se puede pasar a la función crypt junto con la frase de contraseña, y el valor de retorno será la frase de contraseña hash que es texto ASCII imprimible. Usamos el algoritmo bcrypt identificado como cadena de prefijo "$2b$" en el siguiente código de muestra. Observe que el segundo argumento de la función crypt_gensalt especifica qué tan costosa debería ser la generación de hash con el valor 0 especificando el nivel predeterminado del algoritmo dado. En este caso, especificamos 15, que es el valor recomendado para el algoritmo 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);
}

Producción :

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

Utilice estrictas rutinas de manejo de errores para garantizar la ejecución exitosa de las funciones crypt

El código de ejemplo anterior toma la cadena de entrada del usuario y asigna memoria dinámica para almacenarla. Por lo tanto, debemos asegurarnos de que la cadena se lea sin ningún carácter sobrante en el búfer stdio. Para esto, llamamos fflush en stdout y luego llamamos a fgets para tomar la cadena de entrada del usuario. Además, tenga en cuenta comprobar todas las funciones de la biblioteca y las llamadas del sistema en busca de sus valores de retorno de error y llame a perror para generar el mensaje correspondiente.

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

Producción :

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