crypt
(PHP 4, PHP 5, PHP 7)
crypt — Einweg-String-Hashing
Diese Funktion ist (bis jetzt) nicht binary safe!
Beschreibung
$str
[, string $salt
] ) : stringcrypt() gibt einen Hash-String zurück, der unter Verwendung des DES-basierenden Unix-Standard-Hashingalgorithmus oder einem anderen auf ihrem System verfügbaren Algorithmus erstellt wurde.
Der salt
-Parameter ist optional. Allerdings erzeugt
crypt() ohne das salt
einen schwachen
Hash. PHP 5.6 und neuer erzeugen einen E_NOTICE Fehler, wenn der
Parameter nicht angegeben wird. Es ist darauf zu achten ein ausreichend
starkes salt für bessere Sicherheit anzugeben.
password_hash() verwendet einen starken Hash, erzeugt ein starkes Salt, und wendet eine angemessene Anzahl von Runden automatisch an. password_hash() ist ein einfacher crypt()-Wrapper und kompatibel zu bestehenden Passwort-Hashes. Die Verwendung von password_hash() wird empfohlen.
Einige Betriebssysteme unterstützen mehr als eine Methode zum Hashen. So wird
manchmal der DES- durch einen MD5-Algorithmus ersetzt. Der verwendete Algorithmus
wird durch das Salt-Argument bestimmt. Vor PHP 5.3 wurden die verfügbaren Algorithmen
zum Installationszeitpunkt anhand der systemeigenen crypt() Funktion untersucht.
Wird kein Salt angegeben, erzeugt PHP entweder einen 12-Zeichen MD5 Salt oder,
falls MD5 nicht verfügbar ist, einen 2-Zeichen DES-Salt. PHP setzt eine
Konstante CRYPT_SALT_LENGTH
, welche die Länge des längsten von
den Algorithmen unterstützen Salts enthält.
Der Standard-DES-Algorithmus gibt den Salt als erste 2 Zeichen zurück.
Weiterhin werden nur die ersten acht Zeichen von str
genutzt. Wenn also eine längere Zeichenkette verwendet wird, die mit den
selben 8 Buchstaben beginnt, so erhalten Sie denselben Rückgabewert
(sofern Sie ebenfalls den gleichen Salt genutzt haben).
Auf Systemen, wo crypt() mehrere Hashingalgorithmen unterstützt, werden die folgenden Konstanten auf 0 oder 1 gesetzt, je nachdem, ob der entsprechende Typ verfügbar ist:
-
CRYPT_STD_DES
- Standard DES-Hash mit einem 2-Zeichen-Salt aus dem Alphabet "./0-9A-Za-z". Bei Nutzung eines ungültigen Zeichens schlägt crypt() fehl. -
CRYPT_EXT_DES
- Erweiterte DES-basiertes Hashing mit einem 9-Zeichen-Salt, welcher aus einem Unterstrich, 4 Zeichen Iterationsanzahl und 4 Zeichen Salt besteht. Iterationsanzahl und Salt werden durch Zeichen aus dem Alphabet "./0-9A-Za-z" dargestellt. Bei Nutzung eines ungültigen Zeichens schlägt crypt() fehl. -
CRYPT_MD5
- MD5-Hashing mit 12-Zeichen-Salt, beginnend mit "$1$" -
CRYPT_BLOWFISH
- Blowfish-Hash mit einem Salt folgenden Aufbaus: "$2a$", "$2x$" oder "$2y$", gefolgt von einem zweistelligen Kostenparameter, einem weiteren "$", und 22 Zeichen des Alphabets "./0-9A-Za-z". Bei Nutzung eines ungültigen Zeichens gibt crypt() einen leeren String zurück. Der zweistellige Kostenparameter ist der binäre Logarithmus der Iterationsanzahl und muss im Bereich von 04-31 liegen. Bei Nutzung von Werten außerhalb dieses Bereichs schlägt crypt() fehl. Versionen vor PHP 5.3.7 unterstützten nur "$2a$" als Salt-Präfix. Die anderen Präfixe wurden in PHP 5.3.7 eingeführt, um eine Sicherheits-Schwachstelle in der Blowfish-Implementierung zu beheben. Für weitere Informationen siehe » dieses Dokument. Kurz zusammengefasst sollten Entwickler "$2y$" bevorzugt verweden, wenn sie nicht mit PHP Versionen vor PHP 5.3.7 kompatibel sein müssen. -
CRYPT_SHA256
- SHA-256 Hash mit einem 16-Zeichen Salt, beginnend mit "$5$". Wenn anschließend "rounds=<N>$" folgt, gibt der Zahlenwert von N die Iterationsanzahl an, ansonsten wird 5000 als Anzahl angenommen. Die Anzahl muss zwischen 1000 und 999,999,999 liegen. Falls ein Wert außerhalb dieses Bereichs angegeben wird, wird die jeweils näher liegende Grenze als Anzahl genutzt. -
CRYPT_SHA512
- SHA-512 Hash mit einem 16-Zeichen Salt, beginnend mit "$6$". Wenn anschließend "rounds=<N>$" folgt, gibt der Zahlenwert von N die Iterationsanzahl an, ansonsten wird 5000 als Anzahl angenommen. Die Anzahl muss zwischen 1000 und 999,999,999 liegen. Falls ein Wert außerhalb dieses Bereichs angegeben wird, wird die jeweils näher liegende Grenze als Anzahl genutzt.
Hinweis:
Seit PHP 5.3.0 enthält PHP eine eigene Implementation und verwendet diese, wenn das System einen oder mehrere der Algorithmen nicht unterstützt.
Parameter-Liste
-
str
-
Die zu hashende Zeichenkette.
AchtungDie Verwendung des
CRYPT_BLOWFISH
-Algorithmus hat zur Folge, dass derstr
-Parameter auf eine Länge von maximal 72 Zeichen gekürzt wird. -
salt
-
Ein optionaler Salt-String, der die Schlüsselbasis bildet. Falls dieser nicht angegeben wird hängt das Verhalten von der Implementierung des Algorithmus ab und kann daher zu unerwarteten Ergebnissen führen. (Wenn beispielsweise ein Server MD5 unterstützt und der andere nur DES, dann würden beide unterschiedliche Rückgabewerte produzieren, obwohl der String eigentlich gleich ist.)
Rückgabewerte
Gibt die gehashte Zeichenkette zurück oder im Fehlerfall eine Zeichenkette, die kürzer ist als 13 Zeichen und garantiert ist, nicht dem Salt zu entsprechen.
Wenn Passwörter überprüft werden, sollte eine Zeichenkettenvergleichsfunktion, die nicht anfällig für Rechenzeitangriffe ist, verwendet werden um die Ausgabe von crypt() mit dem zuvor bekannten Hash zu vergleichen. Ab PHP 5.6 steht hash_equals() zu diesem Zweck zur Verfügung.
Changelog
Version | Beschreibung |
---|---|
5.6.5 |
Wird die Fehlerzeichenkette "*0" als salt
angegeben, wird nun aus Konsistenz mit anderen Crypt-Implementierungen
"*1" zurückgegeben. Vor dieser Version hat PHP 5.6 fälschlicherweise
einen DES Hash zurückgegeben.
|
5.6.0 |
Erzeugt eine E_NOTICE Sicherheitswarnung, wenn
salt ausgelassen wird.
|
5.5.21 |
Wird die Fehlerzeichenkette "*0" als salt
angegeben, wird nun aus Konsistenz mit anderen Crypt-Implementierungen
"*1" zurückgegeben. Vor dieser Version hat PHP 5.5 fälschlicherweise
einen DES Hash zurückgegeben.
|
5.3.7 | Die $2x$ und $2y$ Blowfish-Modi wurden hinzugefügt. |
5.3.2 | SHA-256 und SHA-512 wurden hinzugefügt auf Basis von Ulrich Drepper's » Implementierung. |
5.3.2 | Blowfishs fehlerhaftes Verhalten wurde behoben, durch welches ein ungültiger Kostenparameter dazu führte, dass auf DES zurückgefallen wurde, anstatt einen Fehlerstring ("*0" or "*1") zurückzugeben. |
5.3.0 | PHP enthält jetzt eine eigene Implementation der MD5-Crypt, Standard DES, Extended DES und des Blowfish-Algorithmus und verwendet diese, wenn das System eine oder mehrere der Algorithmen nicht unterstützt. |
Beispiele
Beispiel #1 crypt()-Beispiele
<?php
$gehashtes_passwort = crypt('mein_Pwd'); // Der Salt wird automatisch generiert
/* Sie sollten das vollständige Ergebnis von crypt() als Salt zum
Passwort-Vergleich übergeben, um Problemen mit unterschiedlichen
Hash-Algorithmen vorzubeugen. (Wie bereits ausgeführt, verwendet
ein Standard-DES-Passwort-Hash einen 2-Zeichen-Salt, ein
MD5-basierter hingegen nutzt 12 Zeichen. */
if (crypt($benutzer_eingabe, $gehashtes_passwort) == $gehashtes_passwort) {
echo "Passwort stimmt überein!";
}
?>
Beispiel #2 Verwendung von crypt() für htpasswd
<?php
// Passwort setzen
$passwort = 'mein_Pwd';
// Hash mit automatisch erstelltem Salt generieren
$hash = crypt($passwort);
?>
Beispiel #3 Verwendung von crypt() mit verschiedenen Hasharten
<?php
/* Die im folgenden Code genutzen Salts sind nur Beispiele und sollten nicht in dieser
Form benutzt werden. Stattdessen muss für jedes Password ein neuer, korrekt formatierter
Salt generiert werden.
*/
if (CRYPT_STD_DES == 1) {
echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}
if (CRYPT_EXT_DES == 1) {
echo 'Extended 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";
}
?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
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
Siehe auch
- hash_equals() - Timing attack safe string comparison
- password_hash() - Erstellt einen Passwort-Hash
- md5() - Errechnet den MD5-Hash eines Strings
- Die Mcrypt-Erweiterung
- Lesen Sie die Man-Pages ihres Unix-Systems, wenn Sie weitere Informationen zu crypt benötigen.
Deutsche Übersetzung
Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.
Vielen Dank im Voraus.
Dokument erstellt 30/01/2003, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/php-rf-function.crypt.html
Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.
Referenzen
Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.