IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Générer 4 chiffres au hasard de manière sécurisée avec PHP


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Générer 4 chiffres au hasard de manière sécurisée avec PHP
    Bonjour,

    J'utilise le code suivant pour générer de manière sécurisée 4 chiffres aléatoires qui seront affichés dans l'image d'un captcha :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
     
    /*** Script pour générer 4 chiffres aléatoires qui seront utilisés dans un captcha ***/
     
    $texte = "";
     
    // On génère une séquence aléatoire
    $random = openssl_random_pseudo_bytes(64).md5("hI4QVLrluGbDKbVtpa4l".time()."Z0");
     
    // On hash avec SHA512 la séquence aléatoire avec d'autres paramètres
    $hash = hash("SHA512","hiJ9DEZsF3hNk54VnkmM".mt_rand(0,pow(10,6)).time().$random);
     
    // On prends les 4 premiers chiffres que l'on rencontre en parcourant le hash ($hash)
    for($i=0;strlen($texte)<=3;$i++)
    {
      if(is_numeric($hash[$i]))
      {
        $texte .= $hash[$i]; // On ajoute à $texte le chiffre
      }
    }
     
    // On affiche les 4 chiffres à l'écran (qui peuvent être utilisés dans l'image d'un captcha par exemple
    echo $texte;
     
    // $texte peut contenir par exemple : 8916
     
    ?>
    http://pastebin.com/uUuRR3vn

    Pensez-vous que ce code est assez sécurisé pour générer 4 chiffres au hasard ?

    N'hésitez pas à commenter si vous avez des suggestions, des conseils, des questions...

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    utiliser tout ça juste pour générer 4 chiffres pour un captcha c'est un peu "too much".
    C'est du captcha donc, au pire tu comptes les tentatives et après tu bloques si nécessaire.

    Une autre approche c'est de jouer sur le nombre d'éléments du captcha ou encore sur le nombre de correspondances à trouver...
    encore une autre voie c'est de ne pas indiquer le nombre de correspondances à trouver, juste le défi du genre : sélectionnez toutes les fleurs...

    Bref, y a de quoi faire un truc sympa sans tomber dans la parano

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui, il est vrai que cela semble un peu too much mais j'essaye d'éviter les attaques statistiques en intégrant à mon code des données introuvables qui permettront d'éviter ces attaques statistiques.

    J'ai un petit site web; je ne peux pas me permettre d'enregistrer 86400 images de fleurs ou autre, c'est pourquoi je suis obligé de passé par ce genre de captcha basique.

    Je joue également avec les filtres sur l'image du captcha pour plus de sécurité.

    Merci de ton message en tout cas.
    Dernière modification par rawsrc ; 15/06/2016 à 19h28. Motif: Inutile de citer un message pour y répondre

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Ça me semble bien compliqué pour 4 chiffres que n'importe quel bot peut attaquer par force brute en moins d'une seconde.

    Sinon, plus généralement, pourquoi utilises-tu des fonctions de hashage (md5, sha512) et time()? Est-ce que tu es sûr que tu rajoutes de l'aléatoire en faisant ça?
    - time() n'est pas aléatoire
    - md5 donne toujours 64 bits et sha512 toujours 512 bits. Comparé à une utilisation pure de openssl_random_pseudo_bytes, ou mieux de random_bytes, tu réduis le nombre de possibilités. Ajouter des "étapes" supplémentaires ne signifie pas toujours renforcer la nature aléatoire du résultat.
    - en matière de crypto, il ne faut pas surtout pas essayer de créer sa propre solution sur un site en prod. S'il y a bien un domaine dans lequel il ne faut pas réinventer la roue, c'est bien celui-là. Utilise plutôt RandomLib et dors tranquille.
    - Et je suis d'accord avec rawsrc, ce n'est vraiment pas nécessaire. Utilise Recaptcha et dors tranquille.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut !

    Mon site web est hébergé sur un hébergeur gratuit, je ne peux donc pas utiliser ReCaptcha ni RandomLib.

    Peut-être en revanche que je devrais trouver une autre manière d'exploiter la fonction openssl_random_pseudo_bytes() dans mon code sans changer sa sécurité... J'aimerais savoir comment je pourrais éviter de « perdre » de l'aléatoire (et donc de la sécurité)...

    Je ferais tantôt une étude statistique sur les caractères générés pour vérifier qu'il n'y ait pas trop de caractères qui reviennent trop souvent...

    Merci.
    Dernière modification par rawsrc ; 16/06/2016 à 08h57. Motif: Inutile de citer un message pour y répondre

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Avec openssl_random_pseudo_bytes tu peux faire un truc dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function nbAleatoire($length)
    {
    	$tab_match = [];
    	while(count($tab_match) < $length)
    	{
    		preg_match_all ('#\d#', hash("sha512",openssl_random_pseudo_bytes("128", $cstrong)), $matches);
    		$tab_match = array_merge($tab_match,$matches[0]);
    	}
    	shuffle($tab_match);
    	return implode('',array_slice($tab_match,0,$length));	
    }
    echo nbAleatoire(4);
    Tu as l'aléatoire de la fonction openssl_random_pseudo_bytes auquel j'ai ajouté un petit shuffle pour la forme. Même en étant très parano ça devrait largement suffire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] chiffre au hasard
    Par epoc.01 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/09/2010, 16h24
  2. Générer n nombres au hasard avec random
    Par fredericbdr dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/12/2009, 19h37
  3. Comment générer des chiffres décimaux ?
    Par Ardely dans le forum Langage
    Réponses: 7
    Dernier message: 15/12/2007, 22h19
  4. Générer un chiffre aléatoire
    Par Invité dans le forum Langage
    Réponses: 18
    Dernier message: 11/10/2007, 18h58
  5. générer des caracteres au hasard
    Par Yepazix dans le forum Langage
    Réponses: 5
    Dernier message: 11/04/2006, 00h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo