Verwendung der crypt-Funktion in C
-
Verwenden Sie die Funktion
crypt
, um Passphrasen für die Speicherung zu hacken -
Strenge Fehlerbehandlungsroutinen verwenden, um die erfolgreiche Ausführung von
crypt
-Funktionen zu garantieren
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
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