[C-Sprache] Verwendung der Krypta-Funktion unter Linux [Passwort-Hashing]

0. Einleitung

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.

Meine Testumgebung Ubuntu 18.04.3 LTS Compiler gcc 7.4.0

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).

1. crypt () Funktion

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.)

1.1 Beispiel für die Verwendung der Funktion crypt ()

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.

2. crypt_r () Funktion

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.

Definition der crypt_data-Struktur struct crypt_data { char keysched[16 * 8]; char sb0[32768]; char sb1[32768]; char sb2[32768]; char sb3[32768]; char crypt_3_buf[14]; char current_salt[2]; long int current_saltbits; int direction, initialized; };

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.

2.1. Beispiel für die Verwendung der Funktion crypt_r ()

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.

2.2 Über \ _GNU \ _SOURCE

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.

oder Die Makrodefinition kann auch über die Befehlszeile erfolgen, sodass Sie sie dort ausführen können. Sie können die Option "-D [= Wert]" zur Kompilierungszeit übergeben. Das Übergeben der Option -DN = 2 zur Kompilierungszeit hat beispielsweise dieselbe Bedeutung wie das Schreiben von "#define N 2" im Quellcode. In diesem Fall können Sie zum Kompilieren die Option -D_GNU_SOURCE hinzufügen, anstatt "#define _GNU_SOURCE" am Anfang des Quellcodes zu schreiben. Wenn Sie Makefile verwenden, ist dies möglicherweise in Ordnung.

3. Über Salz

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.

3.1. Salt ID und Hash Algorithmus

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.

4. Am Ende

Beachten Sie beim Kompilieren die Option ** -lcrypt **.

Bitte weisen Sie auf Fehler hin.

5. Referenz

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/crypt.3.html https://blog.amedama.jp/entry/unix-crypt-3

Recommended Posts

[C-Sprache] Verwendung der Krypta-Funktion unter Linux [Passwort-Hashing]
Verwendung von C216 Audio Controller unter Arch Linux
Verwendung der Zip-Funktion
[Linux] Verwendung des Befehls echo
Verwendung der C-Bibliothek in Python
(Denken Sie schnell daran) Verwendung der LINUX-Befehlszeile
[Tipps] Verwendung des iPhone als Webkamera unter Linux
Wie benutzt man den Dekorateur?
So beschränken Sie die API, die in der gemeinsam genutzten Linux-Bibliothek in C-Sprache veröffentlicht werden soll
Verwendung von GitHub auf einem Server für mehrere Personen ohne Kennwort
[Hyperledger Iroha] Hinweise zur Verwendung des Python SDK
Hinweise zur Verwendung von Marshmallow in der Schemabibliothek
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Verwendung des optparse-Moduls
Verwendung von Dataiku unter Windows
Hinweise zur Verwendung von Pywinauto
So installieren Sie VMware-Tools unter Linux
Wie benutzt man Homebrew in Debian?
Langsame Verwendung der Computersprache 2
Verwendung der Zip-Funktion von Python
Wie man die Computersprache langsam benutzt
Verwendung des ConfigParser-Moduls
[Python] Erklärt anhand eines Beispiels, wie die Formatierungsfunktion verwendet wird
Verwendung der in .mako (.html) direkt in mako definierten Renderfunktion
Verwendung der Spark ML-Pipeline
So installieren Sie das aws-session-manager-Plugin unter Manajro Linux
Wie man Mecab, neologd-ipadic auf Colab verwendet
Verwendung von Google Test in C-Sprache
[Python] Verwendung von __command__, Funktionserklärung
Ich möchte Linux auf dem Mac verwenden
So aktualisieren Sie PHP unter Amazon Linux 2
So verwenden Sie Google Assistant unter Windows 10
So zeigen Sie Piktogramme unter Manjaro Linux an
Memorandum über die Verwendung von Gremlin Python
So bedienen Sie Linux von der Konsole aus
So aktualisieren Sie die Sicherheit unter CentOS Linux 8
Verwendung des IPython-Debuggers (ipdb)
So finden Sie große Dateien unter Linux
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
[Python] Verwendung der Aufzählungsfunktion (Indexnummer und Element extrahieren)
So verwenden Sie MkDocs zum ersten Mal
Verwendung von Python Kivy ④ ~ Ausführung unter Android ~
Verwendung der Grafikzeichnungsbibliothek Bokeh
Verwendung der Google Cloud Translation API
Verwendung der NHK-Programmführer-API
[Algorithmus x Python] Verwendung der Liste
[Python] Verwendung von Hash-Funktion und Taple.
So installieren Sie Camunda Modeler unter Manjaro Linux
Stellen Sie unter Linux (Ubuntu) das Trackpad ein und stellen Sie die Funktion auf Drei-Finger-Wischen ein
Ich möchte die Aktivierungsfunktion Mish verwenden
linux / c> link> Ruft das Ausführungsergebnis des Shell-Befehls im C-Programm ab.> Mir wurde beigebracht, wie man popen () verwendet.
So zeigen Sie das Änderungsdatum einer Datei in C-Sprache bis zu Nanosekunden an
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
Anfänger! Grundlegende Linux-Befehle und Verwendung!