HOWTO · C

Utilice la función crypt en C

Este artículo muestra cómo utilizar la función crypt en C

En esta página

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