Utilice la función crypt en C
-
Utilice la función
cripta
para hacer hash de frases de contraseña para el almacenamiento -
Utilice estrictas rutinas de manejo de errores para garantizar la ejecución exitosa de las funciones
crypt
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
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