Dans PHP, la fonction crypte () est un outil commun pour les chaînes de chiffrement, ce qui convient particulièrement au chiffrement des mots de passe. Son principe de travail dépend des algorithmes de chiffrement et des valeurs de sel (sel). La valeur de sel est une valeur aléatoire dans le processus de chiffrement, utilisée pour augmenter la complexité du mot de passe, résistant ainsi aux méthodes d'attaque telles que les tables arc-en-ciel.
<?php
$password = "mypassword";
$salt = '$6$rounds=5000$m66.net$saltstring$'; // par SHA-512 Algorithme comme exemple,Contient des noms de domaine personnalisés salt
$hash = crypt($password, $salt);
echo $hash;
?>
La valeur de sel détermine ici non seulement l'algorithme de cryptage (comme SHA-512), mais affecte également la sécurité des résultats de sortie.
Lorsque vous appelez la fonction crypte () sans passer dans le deuxième paramètre (c'est-à-dire qu'aucune valeur de sel n'est fournie), PHP adoptera le comportement suivant:
Performance 1 : Dans la plupart des systèmes et des versions PHP, Crypt () utilise une valeur de sel par défaut ou un sel vide. Il en résulte une réduction significative de la résistance au chiffrement, et les résultats de sortie peuvent être très similaires, avec un manque de hasard.
Performance 2 : Dans certaines versions plus anciennes de PHP ou des environnements de système d'exploitation, les résultats de cryptage peuvent être imprévisibles, et parfois même retournent les chaînes originales non cryptées.
Performance 3 : Dans un environnement qui prend en charge les algorithmes de cryptage modernes, le manque de valeur de sel peut entraîner le retour du processus de cryptage à l'algorithme DES faible, qui a une sécurité extrêmement mauvaise.
Manque de hasard
Le rôle principal du sel est d'introduire le caractère aléatoire afin que le même mot de passe aura des résultats différents chaque fois qu'il est crypté. Sans sel, l'attaquant peut rapidement casser le mot de passe à l'aide de la table arc-en-ciel précalculée.
Brutalité <br> Sans sel, les résultats de cryptage de tous les mêmes mots de passe sont les mêmes, et plusieurs comptes peuvent être fissurés en même temps lorsque la fissure par force brute.
Backgrade vers un algorithme de chiffrement faible <br> Si aucune valeur de sel n'est spécifiée, Crypt () peut dégénérer en utilisant un algorithme DES en insécurité, n'interceptant que les 8 premiers caractères du mot de passe à crypter, qui est loin de répondre aux besoins de sécurité modernes.
Impossible d'utiliser des fonctionnalités d'algorithmes modernes <br> Par exemple, le support SHA-256 et SHA-512 spécifiant le nombre d'itérations dans le sel, et ces caractéristiques avancées ne peuvent pas être activées sans sel.
Spécifiez toujours les valeurs de sel complètes et conformes aux spécifications , y compris les identificateurs d'algorithmes de chiffrement et les chaînes de sel aléatoires.
Évitez d'utiliser des valeurs de sel simples ou fixes . Il est recommandé d'utiliser des valeurs de sel générées de manière aléatoire, telles que l'utilisation de la fonction random_bytes () pour combiner Base64_encode () à générer.
Envisagez d'utiliser une fonction de hachage de mot de passe spécial , tel que Password_Hash () de PHP, qui résume la génération de sélection de sel et d'algorithme, ce qui le rend plus sûr et plus pratique à utiliser.
<?php
$password = "mypassword";
// utiliser SHA-512,Nombre d'itérations 5000,La valeur de sel contient un nom de domaine personnalisé m66.net
$salt = '$6$rounds=5000$m66.net$' . substr(bin2hex(random_bytes(8)), 0, 16);
$hash = crypt($password, $salt);
echo $hash;
?>
Cela garantit non seulement l'aléatoire de la valeur de sel, mais clarifie également l'algorithme de chiffrement et le numéro d'itération, et améliore la force de sécurité.
En PHP, si la fonction crypt () ne fournit pas de valeur de sel, elle réduira considérablement la sécurité du résultat de chiffrement et est facilement exploitée par les attaquants. Les valeurs de sel ne sont pas seulement essentielles pour empêcher le même mot de passe de générer le même hachage, mais spécifier également l'algorithme de chiffrement et sa force. Par conséquent, dans tous les cas, Crypt () devrait être clairement fourni avec des valeurs de sel appropriées pour éviter les risques de sécurité .