Verwendung der crypt-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion crypt, um Passphrasen für die Speicherung zu hacken
  2. Strenge Fehlerbehandlungsroutinen verwenden, um die erfolgreiche Ausführung von crypt-Funktionen zu garantieren
Verwendung der crypt-Funktion in C

In diesem Artikel werden verschiedene Methoden zur Verwendung der crypt-Funktion in C erläutert.

Verwenden Sie die Funktion crypt, um Passphrasen für die Speicherung zu hacken

crypt ist eigentlich eine Familie von vier Funktionen, die Hash-Methoden für Passphrasen zur Speicherung auf dem System oder zur Authentifizierung bereitstellen. Beachten Sie, dass diese Funktionen nicht für allgemeines kryptographisches Hashing geeignet sind, da Passphrasen-Hashing im Vergleich zu allgemeinen Funktionen, die auf Schnelligkeit und weniger Rechenleistung ausgelegt sind, rechenintensiv sein muss.

crypt nimmt zwei char*-Argumente, die als const-qualifizierte Parameter übergeben werden. Das erste Argument zeigt auf die Passphrase, die gehasht werden muss, und das zweite ist die spezielle Zeichenkette namens setting, die mit der Funktion crypt_gensalt erzeugt werden soll. Das Argument setting liefert mehrere Parameter für die Funktion crypt, wie z. B. den zu verwendenden Hash-Algorithmus, die Rechenkosten für den Hash (der größere Wert entspricht dem aufwendigeren) und zufällige Salt-Bytes. Beachten Sie, dass die Bytes für das Salz kryptografisch zufällig sein müssen, und sie können separat von den systemeigenen Dienstprogrammen zur Erzeugung von Zufallszahlen bezogen werden. Das folgende Beispiel demonstriert den Fall, in dem der Spezialwert - Null-Zeiger - als dritter Parameter an crypt_gensalt übergeben wird, um den automatischen Abruf von Zufallsbytes anzuzeigen.

Es stehen mehrere Hash-Algorithmen zur Verfügung (ausführlich beschrieben auf dieser Seite), und sie werden als eindeutige Zeichenkettenbezeichner an die Funktion crypt_gensalt übergeben. Sobald crypt_gensalt die Zeichenkette setting zurückgibt, kann sie zusammen mit der Passphrase an die Funktion crypt übergeben werden, und der Rückgabewert ist die gehashte Passphrase, die ein druckbarer ASCII-Text ist. Im nächsten Beispielcode verwenden wir den bcrypt-Algorithmus, der mit der Präfix-Zeichenkette "$2b$" gekennzeichnet ist. Beachten Sie, dass das zweite Argument der Funktion crypt_gensalt angibt, wie aufwändig die Hash-Erzeugung sein soll, wobei der Wert 0 die Standardstufe des jeweiligen Algorithmus angibt. In diesem Fall geben wir 15 an, was der empfohlene Wert für den Hash-Algorithmus bcrypt ist.

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

Ausgabe:

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

Strenge Fehlerbehandlungsroutinen verwenden, um die erfolgreiche Ausführung von crypt-Funktionen zu garantieren

Der vorige Beispielcode nimmt die Eingabezeichenkette vom Benutzer entgegen und allokiert dynamischen Speicher, um sie zu speichern. Daher müssen wir sicherstellen, dass die Zeichenkette ohne Zeichenreste im stdio-Puffer gelesen wird. Dazu rufen wir fflush auf stdout auf und rufen dann fgets auf, um die EingabeZeichenkette vom Benutzer zu übernehmen. Achten Sie außerdem darauf, alle Bibliotheksfunktionen und Systemaufrufe auf ihre Fehlerrückgabewerte zu überprüfen und rufen Sie perror auf, um die entsprechende Meldung auszugeben.

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

Ausgabe:

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