|
|
crypt
Einweg-String-Hashing
Beschreibung
string crypt
( string $str
[, string $salt
] )
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 dargestellt 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.
Achtung
Die Verwendung des CRYPT_BLOWFISH-Algorithmus hat
zur Folge, dass der str-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.
Warnung
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.
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
Anmerkungen
Hinweis:
Es existiert keine decrypt Funktion, da crypt
ein Einweg-Algorithmus ist.
Siehe auch
- hash_equals
- password_hash
- md5
- Die Mcrypt-Erweiterung
- Lesen Sie die Man-Pages ihres Unix-Systems, wenn Sie weitere
Informationen zu crypt benötigen.
|