Maison >développement back-end >tutoriel php >Comment puis-je générer en toute sécurité des nombres aléatoires en PHP pour des applications telles que la réinitialisation de mot de passe ?

Comment puis-je générer en toute sécurité des nombres aléatoires en PHP pour des applications telles que la réinitialisation de mot de passe ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-01 15:53:12218parcourir

How Can I Securely Generate Random Numbers in PHP for Applications Like Password Reset?

Génération sécurisée de nombres aléatoires en PHP : un aperçu complet

La cryptographie nécessite souvent la génération de nombres aléatoires imprévisibles. En PHP, la fonction "mt_rand" ne répond pas à ces exigences. Cet article explore une méthode sécurisée de génération de nombres aléatoires dans PHP lui-même, abordant le problème des mots de passe oubliés.

La solution initialement proposée consiste à stocker une graine et à la mettre à jour à chaque appel, comme suit :

result = seed
seed = sha512(seed . mt_rand())

Cependant, cette approche présente des inconvénients importants. La fonction sha512 n'améliore pas l'entropie comme par magie, et l'appel "mt_rand" est insuffisant pour contrecarrer un adversaire. Au lieu de cela, il est conseillé d'utiliser les sources d'entropie fournies par les systèmes d'exploitation modernes :

  • Plateformes Unix : "/dev/urandom"
  • Plateformes Windows : API cryptographique

Voici un extrait de code PHP pour générer un aléatoire sécurisé de 128 bits string :

$pr_bits = '';
if (file_exists("/dev/urandom")) {
    $fp = fopen('/dev/urandom','rb');
    $pr_bits .= fread($fp, 16);
    fclose($fp);
} elseif (class_exists('COM')) {
    try {
        $CAPI_Util = new COM('CAPICOM.Utilities.1');
        $pr_bits .= $CAPI_Util->GetRandom(16, 0);
        if ($pr_bits) { $pr_bits = md5($pr_bits, TRUE); }
    } catch (Exception $ex) {
        // echo 'Exception: ' . $ex->getMessage();
    }
}

if (strlen($pr_bits) < 16) {
    // Inform the administrator of the missing pseudorandom generator
}

N'oubliez pas d'inclure les deux tentatives de source d'entropie dans votre code pour une portabilité maximale. Bien que cette méthode ne soit pas infaillible, elle offre une amélioration significative de la sécurité par rapport à l'approche initiale basée sur les semences.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn