Ich habe die Möglichkeit, es zu nutzen und zusammenzufassen, was ich untersucht habe. Es scheint, dass es die Funktionen von Linux verwendet, so dass Leute, die es in anderen Sprachen verwendet haben, es wahrscheinlich auf die gleiche Weise verwenden können.
Es gibt zwei Funktionen, die Funktion crypt () und die Funktion crypt_r (), aber die Funktion crypt \ _r () ist die wiedereintrittsfähige Version der Funktion crypt (). Das heißt, die Funktion crypt () ist nicht multithread-sicher, während die Funktion crypt_r () multithread-sicher ist. Ich werde jede der beiden Funktionen nach Anwendungsbeispielen erläutern.
** Hinweis: ** Die Spezifikationen der Kryptofunktion unterscheiden sich je nach Betriebssystem. Wenn Sie also den genauen Inhalt wissen möchten, lesen Sie das Handbuch mit dem Befehl man 3 crypt
.
Der folgende Inhalt ist für GNU / Linux (Ubuntu 18.0.4).
Die Prototypdeklaration lautet wie folgt.
char *crypt(const char *key, const char *salt);
Schlüssel ist die Zeichenfolge, die Sie hashen möchten.
salt ist eine Zeichenkette, die zum Hashing verwendet wird.
Der Rückgabewert ist Hashed Key, wenn keine ID angegeben ist Wenn id angegeben ist, (Salt-String) + "$" + (Hash-Schlüssel). (Die ID wird später beschrieben.)
crypt_test.c
#include<crypt.h>
#include<stdio.h>
#include<string.h>
#define BUFSIZE 1024
int main(void){
char key[BUFSIZE] = "key"; //Die Zeichenfolge, die Sie hashen möchten
char salt_origin[BUFSIZE] = "example"; //Salzschnur
char salt[BUFSIZE];
char encrypted[BUFSIZE]; //Zum Speichern von Ergebnissen
sprintf(salt, "$6$%s", salt_origin); //Salzformung, ID-Spezifikation (später beschrieben)
strcpy(encrypted, crypt(key, salt)); //Die verschlüsselte Variable
//String"$6$example$(Hashed Key)"Wird gelagert
printf("%s\n", encrypted);
}
Fügen Sie beim Kompilieren die Option -lcrypt hinzu.
Die Prototypdeklaration lautet wie folgt.
char *crypt_r(const char *key, const char *salt, struct crypt_data *data);
Die Struktur crypt_data wird in der Header-Datei crypt.h definiert und zum Speichern der Hash-Ergebnisse verwendet.
Bei Variablen in der Struktur crypt_data müssen die initialisierten Elementvariablen auf 0 gesetzt sein, bevor die Strukturvariable bei der ersten Verwendung der Funktion crypt_r () übergeben wird. Die Schlüssel nach dem Hashing werden in der Mitgliedsvariablen keysched gespeichert.
crypt_r_test.c
#define _GNU_SOURCE // crypt_r()Verwenden Sie diese Makrodefinition, um die Funktion zu verwenden
//Muss aufgelistet werden, bevor eine Datei enthalten ist
#include<crypt.h>
#include<stdio.h>
#define BUFSIZE 1024
int main(void){
char key[BUFSIZE] = "key"; //Die Zeichenfolge, die Sie hashen möchten
char salt_origin[BUFSIZE] = "example"; //Salz.
char salt[BUFSIZE];
struct crypt_data data; //Struktur zum Speichern von Hash-Ergebnissen erforderlich
data.initialized = 0; // crypt_r()Muss vor der Verwendung der Funktion durchgeführt werden.
sprintf(salt, "$5$%s", salt_origin); //ID-Spezifikation((Siehe unten)
crypt_r(key, salt, &data);
printf("%s\n", data.keysched); //Die keysched-Mitgliedsvariable
//String"$5$example$(Hashed Key)"Wird gelagert
}
Fügen Sie beim Kompilieren die Option -lcrypt hinzu.
Um die Funktion crypt_r () verwenden zu können, muss die Makrodefinition "#define _GNU_SOURCE" erstellt werden, bevor eine Header-Datei eingefügt wird. Es ist sicher, es am Anfang des Quellcodes zu schreiben. Wenn Sie eine Header-Datei verwenden, die Sie selbst definiert haben, können Sie diese sofort nach dem Include-Guard schreiben.
Die angegebenen Zeichen sind [a-zA-Z0-9./]. Untere Alphabete, obere Alphabete, Zahlen, '.' Und '/'.
Durch Anpassen des Formats des an die Kryptafunktion übergebenen Salt können Sie den Hash-Algorithmus angeben.
Machen Sie Salz wie $ (id) $ (Salzstring) $
.
id ist eine Zahl zur Angabe des Hash-Algorithmus. (Der Hash-Algorithmus wird später beschrieben.)
(Übrigens kann die $ -Marke am Ende der Salzkette weggelassen werden.)
Beispiel. Salt =" $ 5 $ example ";
In diesem Beispiel wird der Hash-Algorithmus von SHA-256 angegeben, und "Beispiel" wird als Salt-Zeichenfolge angegeben.
Wenn nur eine Zeichenfolge ohne Angabe einer ID übergeben wird, wird sie von der DES-Methode gehasht.
id | Hash-Algorithmus |
---|---|
1 | MD5 |
2a | Blowfish(Je nach Betriebssystem ist es möglicherweise nicht verfügbar. |
5 | SHA-256 |
6 | SHA-512 |
Wenn nicht angegeben, ist es DES. DES verwendet nur 2 Zeichen für Salt und erkennt nur 8 Zeichen für Kennwörter. Daher ist DES sehr anfällig und wird nicht empfohlen.
Hash-Algorithmus | Anzahl der Zeichen in der Hash-Zeichenfolge |
---|---|
MD5 | 22 Zeichen |
SHA-256 | 43 Zeichen |
SHA-512 | 86 Zeichen |
Über die Sicherheit des Hash-Algorithmus DES<MD5<SHA-256<SHA-512 Und je größer die ID-Nummer, desto höher die Sicherheit.
Beachten Sie beim Kompilieren die Option ** -lcrypt **.
Bitte weisen Sie auf Fehler hin.
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/crypt.3.html https://blog.amedama.jp/entry/unix-crypt-3
Recommended Posts