La sécurité est toujours l'un des problèmes les plus concernés pour les développeurs lors de la gestion des mots de passe des utilisateurs dans PHP. Bien que la fonction Password_Hash () de PHP ait fourni un moyen pratique et sécurisé de stocker des mots de passe, dans certains scénarios spécifiques, les développeurs peuvent toujours choisir d'utiliser Crypt () pour un contrôle plus détaillé. Cet article présentera comment générer des valeurs de sel plus sûres en combinant Random_Bytes () pour améliorer la sécurité du stockage du mot de passe.
Le sel est un élément de données aléatoires qui est ajouté avant et après le mot de passe et participe aux opérations de hachage, garantissant que la valeur de hachage qu'ils génèrent finalement est également différente même si deux utilisateurs utilisent le même mot de passe. Aucune valeur de sel ou l'utilisation de la valeur de sel fixe rendra le mot de passe plus vulnérable aux attaques de table arc-en-ciel et aux attaques du dictionnaire .
Crypt () est une fonction de hachage de mot de passe. Il prend en charge plusieurs algorithmes de hachage tels que DES , MD5 , SHA-256 , SHA-512 . Parmi eux, SHA-256 et SHA-512 sont actuellement les options les plus recommandées.
Un exemple de crypte () à l'aide de l'algorithme SHA-512:
$password = 'examplePassword';
$salt = '$6$rounds=5000$usesomesillystringforsalt$';
$hash = crypt($password, $salt);
6 $ $ Ici signifie l'utilisation de SHA-512, Rounds = 5000 signifie 5000 itérations, et la chaîne suivante est la valeur de sel.
Par rapport à l'utilisation de chaînes statiques, Random_Bytes () peut générer un flux d'octets aléatoires solide véritablement chiffré, ce qui est idéal pour construire des valeurs de sel sécurisées.
Voici un exemple complet montrant comment combiner random_bytes () et crypte () pour hacher en toute sécurité le mot de passe:
function generateSalt($length = 16) {
// Générer des octets aléatoires de la longueur spécifiée,Et convertir à Base64,Retirez-le à nouveau et peut affecter crypt() Personnages
$rawSalt = base64_encode(random_bytes($length));
// Clair '+'、'/' et '=',Pour s'adapter crypt() Exiger
$cleanSalt = str_replace(['+', '/', '='], '', $rawSalt);
return substr($cleanSalt, 0, $length);
}
function hashPassword($password) {
$salt = generateSalt();
$fullSalt = '$6$rounds=10000$' . $salt . '$';
return crypt($password, $fullSalt);
}
function verifyPassword($password, $hash) {
return hash_equals($hash, crypt($password, $hash));
}
$userPassword = 'mySecret123';
$hashed = hashPassword($userPassword);
// stockage $hashed Aller à la base de données
// Lors de la vérification de la connexion
$inputPassword = 'mySecret123';
if (verifyPassword($inputPassword, $hashed)) {
echo 'Mot de passe correct';
} else {
echo 'Mot de passe d'erreur';
}
Contrôle de la longueur de la valeur du sel : Crypt () a des exigences pour la longueur de la valeur de sel, qui est généralement limitée à 16 caractères, et l'excès de partie sera tronqué.
Ne réutilisez pas les valeurs de sel : les nouvelles valeurs de sel aléatoires doivent être utilisées chaque fois qu'un hachage de mot de passe est généré.
Ne créez pas de structures de hachage manuellement : bien que vous puissiez épisser manuellement les structures de sel (telles que 6 $ Rounds = 10000 $ sel $ ), il est recommandé d'utiliser des méthodes officielles (telles que Password_Hash () ) chaque fois que possible pour éviter les erreurs potentielles.
Mettre à niveau les suggestions : S'il ne s'agit pas d'une exigence spécifique, il est recommandé d'utiliser Password_Hash () et Password_Verify () , qui gère automatiquement les valeurs de sel et la sélection d'algorithmes en interne.
En combinant Random_Bytes () et Crypt () , les développeurs peuvent contrôler manuellement chaque lien du cryptage de mot de passe, améliorer l'aléatoire et l'imprévisibilité du stockage de mot de passe, et ainsi résister à plus de scénarios d'attaque. En particulier dans les systèmes à forte exigence de sécurité, cette méthode offre une garantie plus élevée que les valeurs de sel statique traditionnelles.
Si vous devez renforcer davantage la sécurité, vous pouvez également envisager de combiner les résultats de hachage avec d'autres identificateurs d'utilisateurs (tels que la boîte aux lettres, le nom d'utilisateur, etc.), ou l'utilisation d'une bibliothèque de cryptage plus moderne, comme le sodium . Cependant, la prémisse est toujours: l'utilisation de valeurs de sel aléatoires fiables est la première étape de la sécurité du mot de passe.
Dans le déploiement réel, veuillez vous assurer que HTTPS est activé sur l'ensemble du site et gérer correctement les autorisations de base de données et les politiques de sauvegarde pour éviter les mots de passe en texte brut et les méthodes de cryptage faibles devenant des points faibles dans la sécurité du système.