Utiliser la fonction crypt en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction crypt pour hacher des phrases de passe pour le stockage
  2. Utiliser des routines strictes de traitement des erreurs pour garantir l’exécution réussie des fonctions crypt
Utiliser la fonction crypt en C

Cet article explique plusieurs méthodes d’utilisation de la fonction “crypter” en C.

Utiliser la fonction crypt pour hacher des phrases de passe pour le stockage

crypt est en fait une famille de quatre fonctions qui fournissent les méthodes de hachage de la phrase de passe pour le stockage sur le système ou l’authentification. Notez que ces fonctions ne sont pas adaptées au hachage cryptographique général, car le hachage de la phrase de passe doit être coûteux en termes de calcul par rapport aux fonctions générales conçues pour être rapides et utiliser moins de puissance de traitement.

Crypt prend deux arguments char* passés comme paramètres qualifiés const. Le premier argument indique la phrase de passe qui doit être hachée, et le second est la chaîne spéciale appelée setting, qui doit être générée en utilisant la fonction crypt_gensalt. L’argument setting fournit de multiples paramètres pour la fonction crypt tels que l’algorithme de hachage à utiliser, le coût de calcul du hachage (la plus grande valeur correspondant à la plus coûteuse) et les octets de sel aléatoires. Notez que les octets pour le sel doivent être cryptographiquement aléatoires, et qu’ils peuvent être obtenus séparément des utilitaires de génération de nombres aléatoires spécifiques au système. L’exemple suivant montre le cas où la valeur spéciale - pointeur nul - est passée au crypt_gensalt comme troisième paramètre pour indiquer la récupération automatique des octets aléatoires.

Il existe de nombreux algorithmes de hachage disponibles (entièrement détaillés sur cette page), et ils sont passés comme des identificateurs de chaîne uniques à la fonction crypt_gensalt. Une fois que la fonction crypt_gensalt renvoie la chaîne setting, elle peut être passée à la fonction crypt avec la phrase de passe, et la valeur de retour sera la phrase de passe hachée qui est un texte ASCII imprimable. Nous utilisons l’algorithme bcrypt identifié comme la chaîne de préfixe "$2b$" dans l’exemple de code suivant. Notez que le second argument de la fonction crypt_gensalt spécifie le coût de la génération du hachage avec la valeur 0 spécifiant le niveau par défaut de l’algorithme donné. Dans ce cas, nous spécifions 15, qui est la valeur recommandée pour l’algorithme de hachage 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);
}

Production :

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

Utiliser des routines strictes de traitement des erreurs pour garantir l’exécution réussie des fonctions crypt

L’exemple de code précédent prend la chaîne de saisie de l’utilisateur et lui alloue une mémoire dynamique pour la stocker. Nous devons donc nous assurer que la chaîne est lue sans aucun caractère résiduel dans la mémoire tampon de la stdio. Pour cela, nous appelons fflushsur stdoutet ensuite fgetspour prendre la chaîne d’entrée de l’utilisateur. De plus, il faut vérifier toutes les fonctions de la bibliothèque et les appels système pour leurs valeurs de retour d’erreur et appeler perror pour sortir le message correspondant.

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

Production :

Input string to be hashed: hello there
Encrypted: $2b$15$DkpZq2vJRQoBiK4slxfFa.Eml8PUtFB7CYYH1RJH6XML3ujhX8fqy
Auteur: 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