Partage
  • Partager sur Facebook
  • Partager sur Twitter

Générer une chaîne de caractères aléatoire

    15 novembre 2019 à 2:15:20

    Bonjour tout le monde,

    Mon problème est dans le titre XD

    Non plus sérieusement, dans le cadre d'un devoir en html et en php je dois concevoir un site web qui lors de la création d'un compte doit créer un mot de passe aléatoire unique répondant aux critères suivants :

    - Commence par une majuscule ;

    - Termine par un chiffre ;

    - Fait au moins 8 caractères (en comprenant les deux conditions précédentes et en rejetant les caractères spéciaux tels que , ; : / ! & @ etc.).

    Pour ce qui est de ces critères et de l'unicité j'ai déjà ma solution :

    if(preg_match('#^[A-Z][[:alnum:]]{6,43}[0-9]$#',$newpass))
    {
        // Création du mot de passe
    }

    Pour l'unicité il suffit de vérifier l'existence (ou l'inexistence) d'un doublon dans la database (vous le savez déjà donc je ne vous apprends rien mais OSEF), là où je planche c'est pour générer l'aléatoire tout en respectant ces n conditions lors de la création du mot de passe généré automatiquement lorsqu'un compte est ajouté après sa création.

    Cela dit, le code ci-dessous pourrait bien m'aider à me sortir de ce pétrin :

    function genererChaineAleatoire($longueur = 10)
    {
     $caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
     $longueurMax = strlen($caracteres);
     $chaineAleatoire = '';
     for ($i = 0; $i < $longueur; $i++)
     {
     $chaineAleatoire .= $caracteres[rand(0, $longueurMax - 1)];
     }
     return $chaineAleatoire;
    }
    //Utilisation de la fonction
    echo genererChaineAleatoire();
    echo genererChaineAleatoire(20);


    Tout ce que j'ai à faire c'est de les assembler correctement et prier pour que les conditions soient respectées absolument.

    Dans l'éventualité où ça marcherait (ou pas), pourriez m'exposer des explications pour mieux cerner l'aléatoire en PHP (en C je sais que ce n'est pas exactement de l'aléatoire mais plutôt un tri erratique dans une liste définie par l'utilisateur), merci d'avance.

    PS : J'adore les monologues, ça donne l'impression d'avoir une conversation avec autrui vers 02:15 du matin :p

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 novembre 2019 à 9:09:11

      Salut,

      Je ne pourrais pas exactement t'expliquer comment fonctionne l'aléatoire de A à Z en PHP car je ne me suis jamais penché sur la question. Cependant, je sais que c'est souvent nommé comme étant du pseudo-aléatoire.

      EDIT : j'ai trouvé ce lien à l'instant : https://www.sjoerdlangkemper.nl/2016/02/11/cracking-php-rand/. Je ne sais pas ce qu'il vaut car je viens à peine de commencer à le lire, donc à prendre avec des pincettes.

      Par ailleurs, n'oublie pas qu'en théorie les mots de passe ne devraient pas apparaître en clair dans la base de données. Donc je ne sais pas si tu en as besoin vue que c'est juste un devoir, mais tu peux te pencher sur ces 2 fonctions, ce sera toujours un bagage intéressant pour toi :

      https://www.php.net/manual/fr/function.password-hash.php

      https://www.php.net/manual/fr/function.password-verify.php

      Pour la fonction que tu présentes

      Pour ta sélection de lettre aléatoire, j'utiliserai plutôt random_int (si tu as PHP 7) à la place de rand, elle est normalement plus sûre car la génération se fait de manière cryptographiquement sécurisée et donc mieux adaptée pour ton cas : https://www.php.net/manual/fr/function.random-int.php.

      Et sinon, tu peux toujours utiliser mt_rand, qui n'est pas plus sécurisée mais qui est en soit beaucoup plus rapide que rand https://www.php.net/manual/fr/function.mt-rand.php.

      Autre méthode

      Sinon tu peux utiliser bin2hex combiné avec openssl_random_pseudo_bytes ou encore mieux random_bytes (cryptographiquement sécurisé, mais seulement à partir de PHP 7) :

      https://www.php.net/manual/fr/function.bin2hex.php

      https://www.php.net/manual/fr/function.openssl-random-pseudo-bytes.php

      https://www.php.net/manual/fr/function.random-bytes.php

      Démo :

      <?php
      bin2hex(openssl_random_pseudo_bytes(10));
      bin2hex(random_bytes(10));
      
      // Les résultats seront des chaînes de 20 caractères contenant uniquement des chiffres et des lettres minuscules
      // Exemples : "e9666ae12b1ebc1ce35f", "6073b9ed772b45ce9ddf"
      ?>

      -
      Edité par Anonyme 15 novembre 2019 à 9:28:20

      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2019 à 10:17:23

        Salut,

        la question qui me vient à l'esprit est: "dois-tu créer l'algo ou as-tu le droit d'utiliser les fonctions existante?", à la lecture de ton post, je penche pour la première.

        Dans ce cas, il faut utiliser une boucle DO/WHILE qui vérifierait avec une regexp la règle énoncée "une majuscule au départ, un chiffre en fin, etc..." et dans cette boucle un for qui lui aurait le rôle de créer la chaine.

        Ensuite, vient l'unicité et là tu as déjà la réponse.

        • Partager sur Facebook
        • Partager sur Twitter

        Générer une chaîne de caractères aléatoire

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown