In PHP werden Krypta -Funktionen häufig für das Kennworthashing verwendet. Es ermöglicht die Sicherheit von Hashing durch Salzwert (Salz), um Sicherheitsrisiken wie Regenbogentischangriffe zu verhindern. Viele Entwickler sind jedoch bei der Verwendung von Krypta an Hardcode-Salzwerte gewöhnt, was zu Sicherheitsrisiken führen kann. In diesem Artikel wird detailliert erläutert, wie hartcodierte Salzwerte vermieden werden und so die Sicherheit des Kennwortspeichers verbessert werden.
Hartcodierte Salzwerte beziehen sich auf das Schreiben fester Salzketten direkt in den Code, z. B.:
$salt = '$6$rounds=5000$fixedsaltstring$';
$hash = crypt($password, $salt);
Es gibt offensichtliche Risiken darin:
Wiederverwendung von Salzwert : Alle Benutzer-Passwort-Hashs verwenden das gleiche Salz, und der Angreifer kann den Angriff durch Vorbereitung des Angriffs vorab kalkulieren.
Exponierten Salzwert : Wenn der Quellcode durchgesickert ist und der Angreifer das Salz kennt, wird die Schwierigkeit des Hash -Cracks stark reduziert.
Schwierig zu skalieren : Wenn Sie die Salzstrategie ändern müssen, ist es äußerst unflexibel, den hartcodierten Teil zu ändern.
Um die oben genannten Probleme zu vermeiden, wird empfohlen, dynamische und sichere Salze dynamisch zu erzeugen. Hier sind ein paar wichtige Punkte:
Die random_bytes () -Funktion von PHP kann zufällige Bytes mit hoher Intensität erzeugen, und Salz kann durch Kombinieren von Base64 oder einer ähnlichen Codierung erzeugt werden.
function generateSalt($length = 16) {
$bytes = random_bytes($length);
return substr(strtr(base64_encode($bytes), '+', '.'), 0, $length);
}
Unterschiedliche Algorithmen haben unterschiedliche Anforderungen für Salzformate. Wenn Sie als Beispiel SHA-512 ( $ 6 $ ) einnehmen, lautet das Format:
$6$rounds=5000$saltstring$
Kombiniert mit dynamischem Salz:
$saltString = '$6$rounds=5000$' . generateSalt() . '$';
$hash = crypt($password, $saltString);
Der von Crypt zurückgegebene Hash enthält Salzinformationen. Beim Speichern müssen Sie nur den kompletten Hash aufbewahren, ohne das Salz separat zu sparen.
Rufen Sie bei Überprüfung direkt mit Eingabekennwort und Speicher -Hash auf und vergleichen Sie die Ergebnisse:
function verifyPassword($inputPassword, $storedHash) {
return crypt($inputPassword, $storedHash) === $storedHash;
}
<?php
// Dynamisches Salz erzeugen
function generateSalt($length = 16) {
$bytes = random_bytes($length);
return substr(strtr(base64_encode($bytes), '+', '.'), 0, $length);
}
// Erstellen Sie einen Passwort -Hash
function createHash($password) {
$salt = '$6$rounds=5000$' . generateSalt() . '$';
return crypt($password, $salt);
}
// Passwort überprüfen
function verifyPassword($inputPassword, $storedHash) {
return crypt($inputPassword, $storedHash) === $storedHash;
}
// Beispiel Verwendung
$password = 'mypassword123';
$hash = createHash($password);
echo "Hash -Wert: $hash\n";
if (verifyPassword('mypassword123', $hash)) {
echo "Passwortüberprüfung erfolgreich!\n";
} else {
echo "Passwortüberprüfung fehlgeschlagen!\n";
}
?>
Das Vermeiden von hartcodierten Salzwerten kann die Sicherheit des Passworthashings erheblich verbessern. Durch die Verwendung von PHP -Funktionen für die Zufallszahlenerzeugung wird ein eindeutiger Salzwert dynamisch erstellt und ein vollständiger Hash in der Datenbank gespeichert, was einer Vielzahl von Angriffsmethoden effektiv widerstehen kann.