Bei der Verwendung von PHPs Crypt () -Funktion für Passworthashing wirkt sich die Sicherheit von Salz direkt auf die Sicherheit des Kennwortspeichers aus. Die Funktion des Salzwerts besteht darin, zu verhindern, dass dasselbe Passwort denselben Hash -Wert erzeugt und dadurch den Angriffen der Regenbogentabellen effektiv widersteht. Daher ist es sehr wichtig, einen sicheren und zuverlässigen Salzwert zu erzeugen.
Der Salzwert ist eine zufällige Zeichenfolge, die an das Passwort angehängt und dann gehasht wird. Ein guter Salzwert erfordert die folgenden Eigenschaften:
Einzigartig und zufällig: Jedes Passwort entspricht einem eindeutigen Salzwert.
Lang genug: Vermeiden Sie den Salzwert, der leicht erraten wird.
Geeignet für Hashing -Algorithmen: Unterschiedliche Algorithmen haben Anforderungen an die Länge und das Format des Salzwerts.
Crypt () unterstützt mehrere Verschlüsselungsalgorithmen, und verschiedene Algorithmen haben unterschiedliche Anforderungen an Salzwertformate. Gemeinsame Algorithmen und Salzwertformate sind wie folgt:
DES : Der Salzwert ist 2 Zeichen lang.
MD5 : Beginnen Sie mit $ 1 $ mit maximal 8 Zeichen Salzwert, z. B. $ $ $ $ ABCDEFGH $ .
Blowfish : Beginnen Sie mit $ 2A $ oder 2y $ $ , gefolgt von einem zweistelligen Kostenfaktor und einem Salzwert von 22 Zeichen, z. B. $ 2y $ 10 $ ABCDEFGHIJKLMNOPQRSTUV .
SHA-256 : Beginnen Sie mit $ 5 $ , gefolgt von Salzwert, bis zu 16 Zeichen lang.
SHA-512 : Beginnen Sie mit $ 6 $ , gefolgt von Salzwert, bis zu 16 Zeichen lang.
Blowfish ( $ 2y $ ) oder SHA-512 ( $ 6 $ ) Algorithmen werden empfohlen, da sie sicherer sind und längere Salzwerte unterstützen.
Der Schlüssel zur Erzeugung von Salzwerten ist die Verwendung sicherer Zufallszahlenerzeugungsfunktionen und die Einhaltung der Anforderungen des Salzwertformats des entsprechenden Algorithmus.
Beispielcode:
<?php
function generateSalt($algo = 'bcrypt') {
switch ($algo) {
case 'bcrypt':
// Blowfish brauchen 22 indival Base64 Charakter,Die Kosten sind 10
$cost = 10;
// Mit zufälligen Bytes,转换成可用的Charakter集
$randomBytes = random_bytes(16);
$base64String = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64String);
case 'sha512':
// SHA-512 Maximal zulässige16Charakter盐
$randomBytes = random_bytes(12);
return '$6$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16);
default:
throw new Exception("Unsupported algorithm");
}
}
// Beispiel für die Nutzung
$password = 'user_password';
$salt = generateSalt('bcrypt');
$hash = crypt($password, $salt);
echo "Salzwert:$salt\n";
echo "Hash -Wert:$hash\n";
?>
Im obigen Code:
Random_Bytes () wird verwendet, um sichere zufällige Bytes zu generieren.
Base64_encode () ist codiert und durch + ersetzt, um die Anforderungen des Salzwertformats zu erfüllen.
Blowfish verwendet den Kostenfaktor 10, der sowohl sicher als auch angemessen in der Leistung ist.
Der erzeugte Salzwert befindet sich streng im von Crypt () erforderlichen Format.
PHP 7.2 und höher empfehlen Sie dringend, die Funktion integrierte passwords_hash () zu verwenden, die automatisch die Salzwerterzeugung und die Auswahl der Algorithmus verarbeitet, vereinfacht und sicherer:
<?php
$password = 'user_password';
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash;
?>
Wenn Sie Crypt () manuell verwenden müssen, stellen Sie sicher, dass der Salzwert sicher und zufällig ist und das Format korrekt ist, andernfalls führt er leicht zu einer Schwächung von Hash.