Lorsque vous traitez avec le cryptage de mot de passe dans PHP, Crypt () et Password_Hash () peuvent être utilisés pour générer la valeur de hachage du mot de passe, mais il existe des différences évidentes entre ces deux fonctions. Lors de la sélection des fonctions de chiffrement, la compréhension de leurs principes et avantages respectifs est crucial pour assurer la sécurité de l'application.
Crypt () est une fonction de cryptage de longue date qui peut être retracée aux systèmes UNIX. Il prend en charge une variété d'algorithmes de chiffrement (tels que DES, MD5, SHA-256, SHA-512), selon la valeur de sel que vous fournissez et les algorithmes pris en charge par le système.
$password = 'mySecretPassword';
$salt = '$6$rounds=5000$anexamplesaltstring$'; // utiliser SHA-512
$hash = crypt($password, $salt);
Le hash $ généré sélectionnera l'algorithme de chiffrement en fonction du format de sel fourni. Dans cet exemple, SHA-512 est utilisé.
Password_hash () est une fonction de hachage de mot de passe moderne introduite depuis PHP 5.5. Il utilise l'algorithme BCrypt par défaut et prend également en charge Argon2i et Argon2id dans les versions plus récentes (après PHP 7.2). Il est conçu pour le hachage du mot de passe et gère automatiquement les valeurs de sel et les facteurs de coût, simplifiant considérablement les efforts de codage sécurisé.
$password = 'mySecretPassword';
$hash = password_hash($password, PASSWORD_DEFAULT); // 默认utiliser bcrypt
Le hash $ généré est une chaîne contenant des informations d'algorithme, du coût et du sel, sans avoir besoin de paramètres manuels par le développeur.
caractéristiques | crypte() | Password_hash () |
---|---|---|
Gestion de la valeur du sel | Besoin de configurer manuellement par le développeur | Générer automatiquement |
algorithme | Divers, doivent être spécifiés | BCrypt par défaut, prend en charge Argon2 |
Sécurité | Cela dépend de l'implémentation et de la configuration | Sécurité par défaut, suivant les meilleures pratiques |
Facilité d'utilisation | Complexe, sujet aux erreurs | Simple, facile à utiliser |
Diplôme recommandé | Non recommandé pour les nouveaux projets | Fortement recommandé |
L'algorithme utilisé par Password_Hash () est conçu pour le hachage des mots de passe (tels que Bcrypt et Argon2 ) et peut résister aux technologies de craquage de mot de passe modernes telles que les attaques accélérées GPU.
À l'aide de la constante de Password_Default , PHP peut automatiquement passer à un algorithme plus sûr sans modifier le code. Par exemple:
$hash = password_hash($password, PASSWORD_DEFAULT);
Avec la mise à jour de PHP, Password_default adoptera automatiquement des algorithmes plus forts, tels que le passage de Bcrypt à Argon2id .
Étant donné que Password_Hash () gère automatiquement les valeurs de sel et les facteurs de coût, il réduit considérablement les problèmes de sécurité causés par les erreurs de configuration humaine.
Si vous construisez un système d'authentification des utilisateurs, par exemple, la forme suivante des scripts de traitement d'enregistrement:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
// Enregistrer dans la base de données
$conn = new PDO('mysql:host=localhost;dbname=example', 'user', 'pass');
$stmt = $conn->prepare('INSERT INTO users (username, password) VALUES (?, ?)');
$stmt->execute([$_POST['username'], $hash]);
header('Location: https://m66.net/login-success');
}
Dans ce cas, l'utilisation de Password_Hash () est nettement plus sûre et plus moderne, et peut maintenir la sécurité et la maintenabilité du système pendant longtemps.
Bien que Crypt () soit toujours utilisable, Password_Hash () est un choix plus approprié du point de vue de la sécurité, de la facilité d'utilisation et de la maintenabilité future. Surtout dans les scénarios où les mots de passe utilisateur sont traités, Password_Hash () doit être utilisé avec Password_verify () pour vérifier la saisie de l'utilisateur et créer une application PHP plus sûre.