Hash_PBKDF2 est une fonction fournie par PHP pour générer une clé à l'aide d'une fonction de hachage basée sur un mot de passe (PBKDF2). PBKDF2 est un algorithme qui améliore la sécurité grâce à plusieurs techniques de hachage et de salage, ce qui peut effectivement empêcher les attaques de fissuration par force brute et de dictionnaire.
<span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>
"Sha256" : l'algorithme de hachage sélectionné, en utilisant SHA-256 ici.
$ mot de passe : le mot de passe entré par l'utilisateur.
$ sel : valeur de sel générée au hasard pour augmenter la sécurité du cryptage.
$ itérations : le nombre d'itérations de hachage. Plus le nombre d'itérations est élevé, plus il est difficile de se fissurer.
$ Longueur : la longueur de la clé générée.
FAUX : s'il faut produire des résultats binaires, généralement définis sur false , sortira une chaîne hexadécimale.
La sécurité de PBKDF2 dépend de la valeur de sel et du nombre d'itérations. La définition de ces paramètres peut raisonnablement améliorer considérablement la sécurité du stockage des clés.
Lorsque vous générez une clé, vous devez d'abord vous assurer d'utiliser une valeur de sel générée aléatoire ( $ sel ). La fonction de la valeur de sel est d'éviter le même mot de passe générant la même clé, augmentant encore la difficulté de fissuration par force brute. La longueur de la valeur de sel est généralement recommandée d'être au moins 16 octets pour assurer son aléatoire.
Il est également crucial de définir suffisamment d'itérations dans HASH_PBKDF2 . Théoriquement, plus il y a d'itérations plus longtemps, plus il faut de temps pour générer la clé et plus il est difficile de le casser. Le nombre recommandé d'itérations est d'au moins 100 000 fois. De cette façon, l'attaquant a besoin de plus de temps et de ressources informatiques pour force brute la clé.
<span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-title function_ invoke__">random_bytes</span></span><span>(</span><span><span class="hljs-number">16</span></span><span>)); </span><span><span class="hljs-comment">// générer16Valeur de sel aléatoire des octets</span></span><span>
</span><span><span class="hljs-variable">$iterations</span></span><span> = </span><span><span class="hljs-number">100000</span></span><span>; </span><span><span class="hljs-comment">// Au moins100,000Cette itération</span></span><span>
</span><span><span class="hljs-variable">$key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-number">64</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>); </span><span><span class="hljs-comment">// 64Clé d'octet</span></span><span>
</span></span>
Il est très peu sûr de stocker directement le mot de passe d'origine de l'utilisateur. Dans PHP, la valeur de hachage de la clé doit toujours être stockée, et non la chaîne de mot de passe d'origine. La clé générée par HASH_PBKDF2 a été cryptée et traitée plusieurs fois, et le mot de passe d'origine ne peut pas être récupéré de celui-ci en théorie.
Par exemple, la valeur de clé générée peut être stockée dans une base de données et enregistrée avec d'autres informations de l'utilisateur:
<span><span><span class="hljs-comment">// Stockez les valeurs de hachage de clé et de sel dans la base de données</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>]);
</span></span>
Pour améliorer davantage la sécurité de la clé, un algorithme de chiffrement plus fort peut être considéré pour crypter la clé stockée. Par exemple, les clés générées peuvent être cryptées et stockées à l'aide d'un algorithme de cryptage symétrique tel que AES. Dans ce cas, le stockage clé repose non seulement sur le hachage généré par PBKDF2, mais également sur une couche de chiffrement supplémentaire.
<span><span><span class="hljs-variable">$encryption_key</span></span><span> = </span><span><span class="hljs-string">'your-secure-encryption-key'</span></span><span>;
</span><span><span class="hljs-variable">$encrypted_key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">openssl_encrypt</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-string">'AES-256-CBC'</span></span><span>, </span><span><span class="hljs-variable">$encryption_key</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$iv</span></span><span>);
</span></span>
Notez que lors du chiffrement d'une clé, vous devez assurer le stockage sécurisé de la clé de chiffrement ( $ Encryption_key ). La clé de chiffrement elle-même doit être stockée dans un endroit très sécurisé, comme un module de sécurité matérielle (HSM) ou un service de gestion de clé.
En plus de protéger la clé elle-même, la sécurité de toute la base de données est également cruciale. Assurez-vous que l'accès à la base de données est strictement contrôlé et utilisez des mots de passe solides et des connexions cryptées telles que SSL / TLS pour empêcher les attaques et les violations de données de l'homme au milieu.
La base de données doit adopter le principe des autorisations minimales et seuls les utilisateurs autorisés peuvent accéder aux données sensibles.
Pour améliorer la sécurité à long terme, les mises à jour régulières des clés et des valeurs de sel sont également une mesure de sécurité efficace. Bien que la mise à jour de la clé ne soit pas simple, le risque de fuite peut être évité si la valeur de sel peut être relogée périodiquement et la valeur de sel peut être remplacée.
Par exemple, après que l'utilisateur se soit connecté, l'utilisateur peut être invité à modifier régulièrement son mot de passe et à réincréner le stockage avec une nouvelle valeur de sel et une nouvelle clé.
La prévention des attaques d'injection SQL est une étape de base pour assurer un stockage sécurisé des clés. Assurez-vous que la saisie de l'utilisateur dans les requêtes de base de données est entièrement échappée ou utilisez des instructions de prétraitement pour éviter les vulnérabilités d'injection SQL.
Pour les attaques de fissuration par force brute, le risque peut être réduit en limitant le nombre de tentatives de connexion, en introduisant des mécanismes de code de vérification et en surveillant les comportements suspects de connexion.