In der modernen Webentwicklung ist die Sicherheit der Benutzerauthentifizierung von entscheidender Bedeutung. Wenn der Kennwortschutz nicht vorhanden ist, ist es sehr wahrscheinlich, dass Benutzerinformationen durchlaufen und unermessliche Verluste bringen. Die integrierte Crypt () -Funktion von PHP bietet eine starke Unterstützung für die Kennwortverschlüsselung. In Kombination mit einem angemessenen Prozessdesign kann es die Authentifizierungssicherheit erheblich verbessern. In diesem Artikel wird detailliert eingeführt, wie Sie CryPT () verwenden, um einen sicheren und zuverlässigen Benutzerauthentifizierungsprozess zu implementieren.
Die Crypt () -Funktion basiert auf dem Verschlüsselungsalgorithmus von UNIX und wird verwendet, um Zeichenfolgen (normalerweise Passwörter) zu verschlüsseln. Der Kernvorteil besteht darin, dass es eine Vielzahl von Verschlüsselungsalgorithmen unterstützt, darunter Blowfish, SHA-256, SHA-512 usw., und mit einem Salzwert (Salz-) Mechanismus ausgestattet ist, der die Sicherheit von Kennwörtern erheblich verbessert.
Der Funktionsprototyp lautet wie folgt:
string crypt(string $password, string $salt);
$ password ist der klare Text des Passworts, das verschlüsselt werden soll.
$ salt ist das für die Verschlüsselung verwendete Salz, das den Verschlüsselungsalgorithmus und die Komplexität bestimmen kann.
Bei der Registrierung eines Benutzers müssen wir das Klartextkennwort verschlüsseln und in der Datenbank speichern. Beispiele sind wie folgt:
<?php
// Benutzer eingereichtes Klartextkennwort
$password = $_POST['password'];
// Ein sicheres Salz erzeugen(von Blowfish Als Beispiel)
$salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
// verwenden crypt() Verschlüsselungskennwort
$hashedPassword = crypt($password, $salt);
// Wille $hashedPassword Speichern Sie in der Datenbank
// Beispiel:mysqli oder PDO Code vereinfacht
echo "Verschlüsselter Passwort:$hashedPassword";
?>
Der Blowfish -Algorithmus wird hier verwendet. $ 2y $ repräsentiert Blowfish und 12 sind die Berechnungskosten. Je größer die Zahl ist, desto sicherer ist es, aber desto langsamer die Berechnung.
Random_Bytes (16) erzeugt starke Zufallszahlen, um die Zufälligkeit von Salz zu gewährleisten.
Wenn sich der Benutzer anmeldet, muss er überprüfen, ob das eingegebene Passwort dem in der Datenbank gespeicherten Kennwort übereinstimmt. Beachten Sie, dass das Salz von Crypt () im Verschlüsselungsergebnis enthalten ist, sodass es wiederverwendet werden kann:
<?php
// Vom Benutzer eingegebenes Passwort
$password = $_POST['password'];
// Hash -Passwort -Abfrage aus der Datenbank
$storedHash = /* Passwort -Hash, der durch Abfrageerklärung erhalten wurde */;
// verwenden相同盐值重新加密输入密码
$checkHash = crypt($password, $storedHash);
if (hash_equals($storedHash, $checkHash)) {
// Überprüfung verabschiedet
echo "Erfolgreich anmelden";
} else {
// Überprüfung fehlgeschlagen
echo "用户名oder密码错误";
}
?>
Verwenden Sie Hash_equals () , um zeitliche Vergleiche durchzuführen, um Zeitangriffe zu vermeiden.
Solange das Eingabekennwort das gleiche wie das Salz entspricht, das dem Kennwort-Hash in der Datenbank entspricht, sollte das Ergebnis von CryPT () Recryption genau übereinstimmen.
<?php
// 连接数据库Beispiel(verwenden mysqli)
$mysqli = new mysqli("m66.net", "user", "password", "database");
// Benutzerregistrierung
function registerUser($username, $password) {
global $mysqli;
$salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
$hashedPassword = crypt($password, $salt);
$stmt = $mysqli->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $hashedPassword);
return $stmt->execute();
}
// Benutzeranmeldeüberprüfung
function loginUser($username, $password) {
global $mysqli;
$stmt = $mysqli->prepare("SELECT password FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->bind_result($storedHash);
if (!$stmt->fetch()) {
return false; // Der Benutzer existiert nicht
}
$stmt->close();
$checkHash = crypt($password, $storedHash);
return hash_equals($storedHash, $checkHash);
}
// Beispiel调用
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if (isset($_POST['register'])) {
if (registerUser($username, $password)) {
echo "Erfolgreich registriert";
} else {
echo "Registrierung fehlgeschlagen";
}
} elseif (isset($_POST['login'])) {
if (loginUser($username, $password)) {
echo "Erfolgreich anmelden";
} else {
echo "用户名oder密码错误";
}
}
}
?>
Verwenden Sie HTTPS : Stellen Sie sicher, dass der Datenübertragungsprozess verschlüsselt ist, und verhindern Sie, dass Mann-in-the-Middle-Angriffe.
Begrenzen Sie die Anzahl der Anmeldeversuche : Verhindern Sie Brute Force Cracking.
Regelmäßig aktualisieren Verschlüsselungskosten : Wenn sich die Hardwareleistung verbessert, werden die Kostenparameter von Blowfish rechtzeitig erhöht.
Erkennung von Kennwortstärke : Der Benutzer wird aufgefordert, beim Registrieren ein starkes Passwort festzulegen.
Vermeiden Sie es, sensible Informationen in einfachem Text aufzubewahren .