PHP crypt()Funktionen


PHP String 参考手册PHP-String-Referenzhandbuch

Definition und Verwendung

Die Funktion crypt() gibt eine Zeichenkette zurück, die mit den Algorithmen DES, Blowfish oder MD5 verschlüsselt wurde.

Das Verhalten dieser Funktion unterscheidet sich auf verschiedenen Betriebssystemen, und einige Betriebssysteme unterstützen mehr als einen Algorithmustyp. Während der Installation prüft PHP, welche Algorithmen verfügbar sind und welcher Algorithmus verwendet werden soll.

Der genaue Algorithmus hängt vom Format und der Länge des Parameters salt ab. Salt kann die Verschlüsselung sicherer machen, indem die Anzahl der Zeichenketten erhöht wird, die von einer bestimmten Zeichenkette in Kombination mit einer bestimmten Verschlüsselungsmethode erzeugt werden.

Hier sind einige Konstanten, die mit der Funktion crypt() verwendet werden. Diese Konstantenwerte werden von PHP zum Installationszeitpunkt festgelegt.

Konstanten:

  • [CRYPT_SALT_LENGTH] - Standardmäßige Verschlüsselungslänge. Bei standardmäßiger DES-Verschlüsselung beträgt die Länge 2.
  • [CRYPT_STD_DES] - Standardmäßige DES-basierte Verschlüsselung hat einen 2 Zeichen langen Salt aus dem Alphabet "./0-9A-Za-z". Die Verwendung ungültiger Zeichen im Salt führt dazu, dass die Funktion fehlschlägt.
  • [CRYPT_EXT_DES] - Erweiterte DES-basierte Verschlüsselung hat einen 9 Zeichen langen Salt, bestehend aus 1 Unterstrich, gefolgt von 4 Bytes Iterationsanzahl und 4 Bytes Salt. Diese werden als druckbare Zeichen codiert, 6 Bits pro Zeichen, niedrigstwertiges Zeichen zuerst. Werte 0 bis 63 werden als "./0-9A-Za-z" codiert. Die Verwendung ungültiger Zeichen im Salt führt dazu, dass die Funktion fehlschlägt.
  • [CRYPT_MD5] - MD5-Verschlüsselung hat einen 12 Zeichen langen Salt, der mit $1$ beginnt.
  • [CRYPT_BLOWFISH] - Blowfish-Verschlüsselung hat einen Salt, der mit $2a$, $2x$ oder $2y$ beginnt, einen zweistelligen Kostenparameter "$" und 22 Zeichen aus dem Alphabet "./0-9A-Za-z". Die Verwendung von Zeichen außerhalb des Alphabets führt dazu, dass die Funktion eine Zeichenkette der Länge 0 zurückgibt. Der Parameter "$" ist der Logarithmus zur Basis 2 der Iterationsanzahl für den Blowfish-basierten Hash-Algorithmus und muss im Bereich 04-31 liegen. Werte außerhalb dieses Bereichs führen dazu, dass die Funktion fehlschlägt.
  • [CRYPT_SHA_256] – SHA-256-Verschlüsselung verwendet ein 16 Zeichen langes Salt, das mit $5$ beginnt.Wenn die Salt-Zeichenkette mit "rounds=<N>$" beginnt, wird der numerische Wert von N verwendet, um anzugeben, wie oft die Hashing-Schleife ausgeführt wird, ähnlich wie der Kostenparameter bei Blowfish. Die Standardanzahl der Runden ist 5000, das Minimum ist 1000 und das Maximum ist 999,999,999. Jeder Wert von N außerhalb dieses Bereichs wird auf den nächstgelegenen Grenzwert umgesetzt.
  • [CRYPT_SHA_512] – SHA-512-Verschlüsselung verwendet ein 16 Zeichen langes Salt, das mit $6$ beginnt.Wenn die Salt-Zeichenkette mit "rounds=<N>$" beginnt, wird der numerische Wert von N verwendet, um anzugeben, wie oft die Hashing-Schleife ausgeführt wird, ähnlich wie der Kostenparameter bei Blowfish. Die Standardanzahl der Runden ist 5000, das Minimum ist 1000 und das Maximum ist 999,999,999. Jeder Wert von N außerhalb dieses Bereichs wird auf den nächstgelegenen Grenzwert umgesetzt.

Auf Systemen, auf denen diese Funktion mehrere Algorithmen unterstützt, werden die oben genannten Konstanten auf "1" gesetzt, wenn sie unterstützt werden, andernfalls auf "0".

Hinweise:Es gibt keine entsprechende Entschlüsselungsfunktion. Die Funktion crypt() verwendet einen Einweg-Algorithmus.


Syntax

crypt(str,salt)

Parameters Beschreibung
str Erforderlich. Gibt die zu codierende Zeichenkette an.
salt Optional. Eine Zeichenkette, die verwendet wird, um die Anzahl der codierten Zeichen zu erhöhen und die Codierung sicherer zu machen. Wenn der Parameter salt nicht angegeben wird, wird bei jedem Aufruf der Funktion ein zufälliger Salt erzeugt.

Technische Details

Rückgabewert: Gibt die verschlüsselte Zeichenkette zurück oder, falls dies fehlschlägt, eine Zeichenkette mit weniger als 13 Zeichen, die garantiert vom Salt verschieden ist.
PHP-Version: 4+
Änderungsprotokoll: In PHP 5.3.7 wurden die Blowfish-Modi $2x$ und $2y$ hinzugefügt, um potenzielle High-Bit-Angriffe zu behandeln.

In PHP 5.3.2 wurden die Konstanten SHA-256 und SHA-512 hinzugefügt.

Seit PHP 5.3.2 gibt Blowfish bei ungültigen Runden eine "failure"-Zeichenkette ("*0" oder "*1") zurück, anstatt auf DES zurückzugreifen.

Seit PHP 5.3.0 enthält PHP eine eigene MD5-Verschlüsselungsimplementierung, eine Standard-DES-Implementierung, eine erweiterte DES-Implementierung und den Blowfish-Algorithmus. Wenn das System die oben genannten Algorithmen nicht unterstützt, wird die von PHP mitgelieferte Algorithmusimplementierung verwendet.


Beispiele

Beispiel 1

<?php $hashed_password = crypt('mypassword'); //Salt automatisch generieren /*Sie sollten das vollständige von crypt() zurückgegebene Ergebnis als Salt für die Passwortverifizierung verwenden, um Probleme zu vermeiden, die durch die Verwendung unterschiedlicher Hashing-Algorithmen entstehen. (Wie oben erwähnt, verwenden Passwort-Hashes auf Basis des Standard-DES-Algorithmus ein Salt aus 2 Zeichen, während Hashes auf Basis des MD5-Algorithmus ein Salt aus 12 Zeichen verwenden.)*/ if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { echo "Passwort verifiziert!"; } ?>

Beispiel 2

Verwendung von htpasswd für crypt()-Verschlüsselung:

<?php //Ein Passwort festlegen $password = 'mypassword'; //Hashwert mithilfe eines automatischen Salts ermitteln $hash = crypt($password); ?>

Beispiel 1

In diesem Beispiel verwenden wir verschiedene Hash-Typen:

<?php if (CRYPT_STD_DES == 1) { echo 'Standard-DES: ' . crypt('rasmuslerdorf', 'rl') . "\n"; } if (CRYPT_EXT_DES == 1) { echo 'Erweitertes DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n"; } if (CRYPT_MD5 == 1) { echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n"; } if (CRYPT_BLOWFISH == 1) { echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n"; } if (CRYPT_SHA256 == 1) { echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n"; } if (CRYPT_SHA512 == 1) { echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n"; } ?>

Der obige Code gibt Folgendes aus (abhängig vom Betriebssystem):

Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5:          $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish:     $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256:      $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512:      $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21



PHP String 参考手册PHP-String-Referenzhandbuch Weitere Erweiterungen