Arch manual pages

CRYPT(3) Linux-Programmierhandbuch CRYPT(3)

crypt, crypt_r - Passwort- und Datenverschlüsselung

#define _XOPEN_SOURCE       /* siehe feature_test_macros(7) */
#include <unistd.h>
char *crypt(const char *key, const char *salt);
#define _GNU_SOURCE         /* siehe feature_test_macros(7) */
#include <crypt.h>
char *crypt_r(const char *key, const char *salt,
              struct crypt_data *data);

Linken Sie mit der Option -lcrypt.

crypt() ist die Funktion für die Verschlüsselung von Passwörtern. Sie beruht auf dem »Data Encryption«-Standardalgorithmus. Dieser wurde abgewandelt, um (unter anderem) vom Einsatz von Hardware-Implementierungen von Schlüsselsuchen abzuschrecken.

key ist das vom Benutzer eingegebene Passwort.

salt ist eine aus zwei Zeichen bestehende Zeichenkette aus dem Zeichenvorrat [a-zA-Z0-9./]. Diese Zeichenkette wird dafür verwendet, den Algorithmus auf eine von 4096 unterschiedliche Arten zu beeinflussen.

Aus den untersten sieben Bit jedes der ersten acht Zeichen von key wird ein 56-Bit-Schlüssel erzeugt. Dieser 56-Bit-Schlüssel wird verwendet, um wiederholt eine konstante Zeichenkette zu verschlüsseln (üblicherweise eine Zeichenkette aus lauter Nullen). Der zurückgegebene Wert zeigt auf das verschlüsselte Passwort, eine Reihe von 13 druckbaren ASCII-Zeichen. (Die ersten beiden Zeichen repräsentieren den Salt selbst.) Der Rückgabewert zeigt auf statische Daten, deren Inhalt bei jedem Aufruf überschrieben wird.

Warnung: Der Schlüsselraum besteht aus 2**56 gleich 7.2*10^16 möglichen Werten. Eine vollständige Durchsuchung dieses Schlüsselraums ist mit massiv parallelen Computern möglich. Es ist Software wie beispielsweise crack(1) verfügbar und durchsucht den Teil, der gewöhnlich von Menschen für Passwörter benutzt wird. Daher sollten Passwörter wenigstens übliche Namen und Wörter vermeiden. Die Verwendung eines passwd(1)-Programms, das automatisch während der Eingabe auf leicht zu knackende Passwörter prüft, wird empfohlen.

Der DES-Algorithmus selbst hat ein paar Eigenarten, mit denen die Verwendung von crypt(3) für etwas Anderes als Passwortverschlüsselung eine sehr schlechte Wahl wird. Wenn Sie vorhaben, die crypt()-Schnittstelle für ein kryptografisches Projekt zu verwenden, tun Sie es nicht: Holen Sie sich ein gutes Buch über Verschlüsselung und eine der weitläufig verfügbaren DES-Bibliotheken.

crypt_r() ist eine ablaufinvariante Version von crypt(). Die Struktur, auf die data zeigt, wird für die Speicherung von Ergebnisdaten und Buchhaltungsinformationen verwendet. Der Aufrufende sollte die Struktur lediglich bereitstellen und data->initialized auf Null setzen, bevor crypt_r() erstmalig aufgerufen wird.

Bei Erfolg wird ein Zeiger auf das verschlüsselte Passwort zurückgegeben. Tritt ein Fehler auf, ist der Rückgabewert NULL.

EINVAL
salt hat das falsche Format.
ENOSYS
Die Funktion crypt() wurde nicht implementiert, wahrscheinlich wegen Export-Beschränkungen der USA.
EPERM
/proc/sys/crypto/fips_enabled hat einen von Null verschiedenen Wert und es wurde versucht, einen schwachen Verschlüsselungstyp wie DES zu verwenden.

Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
Schnittstelle Attribut Wert
crypt() Multithread-Fähigkeit MT-Unsafe race:crypt
crypt_r() Multithread-Fähigkeit MT-Safe

crypt(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. crypt_r() ist eine GNU-Erweiterung.

Die Funktionen crypt(), encrypt(3) und setkey(3) sind Teil der POSIX.1-2008 XSI Options Group for Encryption und sind optional. Falls die Schnittstelle nicht verfügbar ist, dann ist die symbolische Konstante _XOPEN_CRYPT entweder nicht definiert oder auf -1 definiert und die Verfügbarkeit kann zur Laufzeit mit sysconf(3) überprüft werden. Dies kann der Fall sein, falls die nachgelagerte Distribution vom Glibc Crypt auf libxcrypt umgestiegen ist. Bei der Neuübersetzung von Anwendungen in solchen Distributionen muss der Programmierer erkennen, falls _XOPEN_CRYPT nicht verfügbar ist und <crypt.h> für die Funktionsprototypen einschließen; ansonsten ist libxcrypt ein ABI-kompatibler Austauschersatz.

Die Glibc-Version dieser Funktion unterstützt weitere Verschlüsselungsalgorithmen.

Wenn salt eine Zeichenkette ist, die mit den Zeichen »$id$« beginnt, denen eine optional mit »$« abgeschlossene Zeichenkette folgt, hat das Ergebnis die Form:

$id$salt$encrypted

id identifiziert die anstelle von DES verwandte Verschlüsselungsmethode und legt fest, wie der Rest der Passwortzeichenkette interpretiert wird. Die folgenden Werte von id werden unterstützt:

ID | Methode
1 | MD5
2a | Blowfish (nicht im Hauptentwicklungszweig der Glibc;
| in einigen Linux-Distributionen hinzugefügt)
5 | SHA-256 (seit Glibc 2.7)
6 | SHA-512 (seit Glibc 2.7)

Daher enthalten $5$salt$encrypted und $6$salt$encrypted das mit auf SHA-256 respektive SHA-512 basierenden Funktionen verschlüsselte Passwort.

»salt« steht für die bis zu 16 Zeichen, die »$id$« im Salt folgen. Der »encrypted«-Teil der Passwortzeichenkette entspricht dem tatsächlich berechneten Passwort. Die Länge dieser Zeichenkette ist festgelegt:

MD5 | 22 Zeichen
SHA-256 | 43 Zeichen
SHA-512 | 86 Zeichen

Die Zeichen in »salt« und »encrypted« werden aus dem Vorrat [a-zA-Z0-9./] gewählt. In den MD5- und SHA-Implementierungen ist der gesamte key signifikant (anstelle nur der ersten acht Byte bei DES).

Seit Glibc 2.7 unterstützen die SHA-256- und SHA-512-Implementierungen eine benutzerdefinierte Anzahl an Hash-Runden, standardmäßig 5000. Falls die Zeichen »$id« in dem Salt von »rounds=xxx$« gefolgt werden, wobei xxx eine Ganzzahl ist, hat das Ergbnis die Form:

$id$rounds=yyy$salt$encrypted

Hierbei ist yyy die Anzahl der tatsächlich eingesetzten Hash-Runden. Die Anzahl der verwandten Runden ist tatsächlich 1000, falls xxx kleiner als 1000 ist, 999999999, falls xxx größer als 999999999 ist; andernfalls ist sie mit xxx identisch.

login(1), passwd(1), encrypt(3), getpass(3), passwd(5)

Diese Seite ist Teil der Veröffentlichung 5.03 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.

30. April 2018