Dans le développement Web moderne, la sécurité de l'authentification des utilisateurs est cruciale. Si la protection par mot de passe n'est pas en place, elle est très susceptible de conduire à une fuite d'informations utilisateur et à entraîner des pertes incommensurables. La fonction Crypt () intégrée de PHP fournit une prise en charge solide pour le cryptage des mots de passe. Combiné avec une conception de processus raisonnable, il peut considérablement améliorer la sécurité de l'authentification. Cet article présentera en détail comment utiliser Crypt () pour implémenter un processus d'authentification utilisateur sûr et fiable.
La fonction crypt () est basée sur l'algorithme de chiffrement d'Unix et est utilisée pour crypter les chaînes (généralement des mots de passe). Son avantage principal est qu'il prend en charge une variété d'algorithmes de chiffrement, y compris Blowfish, SHA-256, SHA-512, etc., et est livré avec un mécanisme de valeur de sel (sel), qui améliore considérablement la sécurité des mots de passe.
Le prototype de fonction est le suivant:
string crypt(string $password, string $salt);
$ mot de passe est le texte clair du mot de passe à crypter.
$ Le sel est le sel utilisé pour le cryptage, qui peut déterminer l'algorithme de chiffrement et la complexité.
Lors de l'enregistrement d'un utilisateur, nous devons crypter le mot de passe en texte brut et le stocker dans la base de données. Les exemples sont les suivants:
<?php
// Mot de passe en texte en clair soumis par l'utilisateur
$password = $_POST['password'];
// Générer un sel sûr(par Blowfish Par exemple)
$salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
// utiliser crypt() Mot de passe de chiffrement
$hashedPassword = crypt($password, $salt);
// Volonté $hashedPassword Enregistrer dans la base de données
// Exemple:mysqli ou PDO Code simplifié
echo "Mot de passe crypté:$hashedPassword";
?>
L'algorithme Blowfish est utilisé ici. 2 ans $ représente Blowfish, et 12 est le coût de calcul. Plus le nombre est grand, plus il est sûr, mais plus le calcul est lent.
Random_Bytes (16) génère de forts nombres aléatoires pour assurer l'aléatoire du sel.
Lorsque l'utilisateur se connecte, il doit vérifier que le mot de passe entré correspond au mot de passe enregistré dans la base de données. Notez que le sel de crypte () est contenu dans le résultat du chiffrement, il peut donc être réutilisé:
<?php
// Mot de passe entré par l'utilisateur
$password = $_POST['password'];
// Requête de mot de passe de hachage de la base de données
$storedHash = /* Hash de mot de passe obtenu par déclaration de requête */;
// utiliser相同盐值重新加密输入密码
$checkHash = crypt($password, $storedHash);
if (hash_equals($storedHash, $checkHash)) {
// Vérification a été adoptée
echo "Connectez-vous avec succès";
} else {
// Échec de la vérification
echo "用户名ou密码错误";
}
?>
Utilisez hash_equals () pour effectuer des comparaisons sécurisées pour éviter les attaques de temps.
Tant que le mot de passe d'entrée est le même que le sel correspondant au hachage de mot de passe dans la base de données, le résultat de la réincrryption crypte () doit correspondre exactement.
<?php
// 连接数据库Exemple(utiliser mysqli)
$mysqli = new mysqli("m66.net", "user", "password", "database");
// Enregistrement des utilisateurs
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();
}
// Vérification de la connexion de l'utilisateur
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; // L'utilisateur n'existe pas
}
$stmt->close();
$checkHash = crypt($password, $storedHash);
return hash_equals($storedHash, $checkHash);
}
// Exemple调用
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if (isset($_POST['register'])) {
if (registerUser($username, $password)) {
echo "Enregistré avec succès";
} else {
echo "L'inscription a échoué";
}
} elseif (isset($_POST['login'])) {
if (loginUser($username, $password)) {
echo "Connectez-vous avec succès";
} else {
echo "用户名ou密码错误";
}
}
}
?>
Utilisez HTTPS : Assurez-vous que le processus de transmission des données est chiffré et empêchez les attaques d'homme dans le milieu.
Limitez le nombre de tentatives de connexion : Empêchez la fissuration de la force brute.
Mettre à jour régulièrement les coûts de cryptage : à mesure que les performances matérielles s'améliorent, les paramètres du coût de Blowfish sont augmentés en temps opportun.
Détection de force du mot de passe : l'utilisateur est invité à définir un mot de passe solide lors de l'enregistrement.
Évitez de stocker des informations sensibles en texte brut .