Position actuelle: Accueil> Derniers articles> Utilisez la fonction hash_equals pour l'authentification des utilisateurs sécurisés

Utilisez la fonction hash_equals pour l'authentification des utilisateurs sécurisés

gitbox 2025-05-29

En PHP, l'authentification des utilisateurs est le lien de base dans la création d'applications sécurisées. Lorsque vous comparez les mots de passe ou les jetons, les méthodes de comparaison de chaînes dangereuses peuvent conduire à une attaque temporelle, permettant à l'attaquant de déduire des informations sensibles. PHP fournit une fonction hash_equals () spécialement conçue pour empêcher de telles attaques, qui peuvent comparer deux chaînes de manière constante pour assurer la sécurité.

Cet article présentera comment utiliser la fonction hash_equals () pour implémenter un processus d'authentification utilisateur sécurisé pour éviter les risques de sécurité courants.


1. Qu'est-ce qu'une attaque de synchronisation?

L'attaque de temps fait référence à l'attaquant deviner progressivement des informations sensibles, telles que le hachage de mot de passe ou les jetons d'authentification, en mesurant la différence de temps requise pour différentes chaînes d'entrée en mesurant le programme.

Les fonctions de comparaison traditionnelles de chaîne (telles que == ou STRCMP ) reviendront le plus tôt possible lorsque le match échoue, entraînant le temps de comparaison qui dépend de la similitude de la chaîne, exposant ainsi les informations.


2. Hash_equals () en php

hash_equals () est une fonction fournie par PHP 5.6 et plus. Il est conçu pour comparer deux chaînes à un moment constant pour éviter les fuites d'informations en raison des différences de temps de retour.

Prototype de fonction:

 bool hash_equals(string $known_string, string $user_string)
  • $ connu_string : une chaîne connue (généralement une valeur de hachage stockée).

  • $ user_string : la chaîne entrée par l'utilisateur (valeur qui doit être vérifiée).

Retour Vrai si deux chaînes sont égales, sinon retourne false .


3. Exemple d'utilisation de hash_equals () pour implémenter une authentification sécurisée

Supposons que lorsque l'utilisateur s'inscrit, nous avons le mot de passe haché et stocké à l'aide d'un algorithme de sécurité. Lors de la connexion, nous devons vérifier le mot de passe entré par l'utilisateur.

Exemple de code:

 <?php
// Lors de l&#39;enregistrement des utilisateurs,Stocker le hachage de mot de passe à la base de données
$password = 'user_password123';
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// Lorsque l&#39;utilisateur se connecte,Vérifier le mot de passe
$input_password = $_POST['password'] ?? '';

// Vérifier le mot de passe
if (password_verify($input_password, $hashed_password)) {
    // Sortez la chaîne de hachage enregistrée dans la base de données
    $stored_hash = $hashed_password;
    // Remanier le mot de passe de l&#39;utilisateur à titre de comparaison(Le scénario de démonstration ici est les jetons de vérification et autres situations)
    $input_hash = hash('sha256', $input_password);

    // utiliser hash_equals Comparaison de temps constante
    if (hash_equals($stored_hash, $input_hash)) {
        echo "Certification réussie";
    } else {
        echo "L&#39;authentification a échoué";
    }
} else {
    echo "L&#39;authentification a échoué";
}
?>

Remarque : Dans l'exemple ci-dessus, Password_verify () lui-même a vérifié en toute sécurité le hachage de mot de passe, et hash_equals () convient aux scénarios qui vérifient les jetons API ou les valeurs de hachage personnalisées.


4. Exemples de sécurité pour la vérification des jetons API

Dans de nombreux scénarios, nous devons vérifier si le jeton API passé par l'utilisateur correspond au jeton stocké sur le serveur. Si vous utilisez == directement, il y a un risque d'attaque de temps.

Exemple:

 <?php
// Stockage côté serveurAPIJeton
$stored_token = 'abc123def456';

// 用户提交的Jeton
$provided_token = $_GET['token'] ?? '';

// Faire une comparaison sûre
if (hash_equals($stored_token, $provided_token)) {
    echo "Jeton验证通过";
} else {
    echo "Jeton验证失败";
}
?>

De cette façon, même si les jetons ne correspondent pas, l'attaquant ne peut pas déduire le jeton correct en comparant le processus long.


5. Résumé

  • hash_equals () fournit une comparaison constante de chaîne de temps qui empêche les attaques temporelles.

  • Dans la vérification du mot de passe, il est recommandé d'utiliser Password_Hash () et Password_Verify () , et hash_equals () convient aux comparaisons sécurisées de jetons ou de valeurs de hachage.

  • En utilisant rationnellement hash_equals () , la sécurité du processus d'authentification peut être considérablement améliorée et le risque de fuite d'informations sensibles peut être réduit.


Si vous souhaitez en savoir plus sur les meilleures pratiques de certification de sécurité PHP, vous pouvez visiter https://gitbox.net/php-security .