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

Langage PHP Discussion :

Renforcer le hasard d'un numéro aléatoire


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut Renforcer le hasard d'un numéro aléatoire
    Bonjour,

    J'attribue un numéro de session aléatoire aux membres à l'instant où ils s'identifient.

    Pour ce faire je prend la moment de la connexion et je le crypte avec md5() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $numeroConnexion=time();
    $numeroConnexion=md5(uniqid (rand()));
    Cela étant, la probabilité que deux personnes s'identifient à la même seconde, si elle est faible, n'est tout de même pas inconcevable.

    Que me suggérez-vous pour rendre encore plus aléatoire ce numéro de connexion ?

    Merci pour vos réponses.
    C'est pas parce que j'ai tort que vous avez raison.

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    tu n'aimes pas les sessionID générées par PHP ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    C'est pour un système anti vol de session en fait et là je crée un numéro de connexion qui me permet d'identifier le membre au travers d'une session sans faire passer des informations personnelles tels que l'id (qui lui reste toujours le même).

    Ceci dit en effet pourquoi ne pas prendre l'id de session, mais je le récupère comment ? Je peux aussi le concaténer au time() et "md5iser" le tout.

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $a=time();
    $b=md5(uniqid (rand()));
    $c=$a.$b;
    $d=md5($c);
    Cela ça doit être bon, mais n'ai-je pas commis une erreur de syntaxe dans la concaténation de $a et $b pour obtenir $c ?
    C'est pas parce que j'ai tort que vous avez raison.

  4. #4
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par psychoBob
    Ceci dit en effet pourquoi ne pas prendre l'id de session, mais je le récupère comment ?
    Ben...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ouh là non, je vais allez me coucher moi, en fait je pige même plus mon script...

    Lorsque les gens s'identifient je leur attribue un numéro de session comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $numeroConnexion=md5(uniqid (rand()));
    Je prend pas le time en md5(), j'utilise le time pour controler le temps d'inactivité, rien à voir...

    Hu hu désolé


    (ça doit être suffisant le md5(), il y a peu de chance que ça m'en sorte deux similaire un jour quand même)
    C'est pas parce que j'ai tort que vous avez raison.

  6. #6
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par psychoBob
    (ça doit être suffisant le md5(), il y a peu de chance que ça m'en sorte deux similaire un jour quand même)
    Si ça arrive, tu me prends un ticket de loto, hein...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon alors histoire de compliquer le problème et vu que l'on (je) ne connait pas la probabilité de sortir un md5() similaire pour deux membres, sachant qu'ils sont updatés à chaque nouvelle connexion...

    Et sachant que mon "idée" que je reprend et qui est basé sur le time() est pas forcément lamentable dans la mesure ou j'ai un oeil fermé et un pied dans le lit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $a=time();
    $b=md5(uniqid (rand()));
    $c=$a.$b;
    $d=md5($c);
    Je vous balance une question sauvage en guise de bonne nuit :

    - Si le membre 1 se connecte à time()
    - Si je crée à ce moment là un md5()
    - Si je concatène les deux et que je repasse tout ça par md5()
    J'obtiens un md5(), ok.

    -Maintenant le membre 2 se connecte à un time différent() (ou le même d'ailleur, si vraiment on a pas de bol).
    - On recrée un md5()
    - On le concatène à son time() et on le repasse par md5()

    Au final, peut-on se retrouver avec le md5() du membre 1, ou est-ce impossible puisque le time() de connexion de 2 et son md5() concaténés sont à priori différent ?
    Sans rentrer dans les délires probabiliste, la question est plutot l'opération de concaténation du md5() avec le time() PLUS le repassage du tout par md5() annule-t'il l'effet certain de l'unicité du time() dans la mesure ou on a quand même pas de pot si deux membres s'identifient à la même seconde ?
    C'est pas parce que j'ai tort que vous avez raison.

  8. #8
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par psychoBob
    Au final, peut-on se retrouver avec le md5() du membre 1, ou est-ce impossible puisque le time() de connexion de 2 et son md5() concaténés sont à priori différent ?
    C'est toujours possible... à mon avis c'est pas moins probable qu'avec un md5 tout bête, et a fortiori qu'avec le session id de php de base... qui fait 128 bits aussi chez moi, et qui est sans doute un MD5.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Donc en fait tu réponds à l'édit que tu n'as sans doute pas eu le temps de lire et dans lequel je disais, je m'autocite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sans rentrer dans les délires probabiliste, la question est plutot l'opération de concaténation du md5() avec le time() PLUS le repassage du tout par md5() annule-t'il
     l'effet certain de l'unicité du time() 
    dans la mesure
     ou on a 
    quand même pas de pot si deux membres s'identifient 
    à la même seconde ?
    Sinon je peux faire un autre truc : je concatène le time() passé par md5() AVEC l'id du membre, lui aussi passé par MD5().
    Et je repasse le tout par md5().

    Le time() peut être identique donc on peut avoir deux md5() différents.
    Mais l'id du membre est forcément unique, de même que le md5() qui en résulte.
    Donc en concaténant les deux on obtient une chaine qui ne peut être qu'unique.
    Idem pour md5() qui en résulte.

    ça vous parait juste ?

    **edit** c'est vraiement lourding ce système de scroll qui apparait lors des copier coller, les retours à la ligne ne se font pas.
    C'est pas parce que j'ai tort que vous avez raison.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon au final j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //on prend l'heure de la connexion
     (mais deux membres peuvent se connecter en même temps).
    $numeroConnexion=time();
     //On concatène le moment de la connexion à l'id du membre (forcément unique)
    $numeroConnexion=$numeroConnexion.$id;
     //on recrytpe la chose obtenue afin d'avoir un numéro
     absolument unique
    $numeroConnexion=md5($numeroConnexion);
    Pour la concaténation, je n'ai pas fait d'erreur ? ça vous semble bon dans l'idée, pour avoir un md5() absolument unique ?
    C'est pas parce que j'ai tort que vous avez raison.

  11. #11
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par psychoBob
    ça vous semble bon dans l'idée, pour avoir un md5() absolument unique ?
    Je redis ce que j'ai dit, à mon avis ça change pas grand-chose, mais pour savoir si ça améliore le md5 il faudrait se plonger dans l'arithmétique sous-jacente.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    A la base, le md5() d'un nombre x donnera toujours le même md5(x).

    Donc dans ce cas on a :
    - un numéro time() T qui peut être le même pour plusieurs membres, mais qui ne resortira jamais par la suite.
    - Un id de membre I qui est toujours unique.
    - On concatène T.I ce qui nous donne un numéro TI unique qui ne pourra jamais ressortir car time() sera par la suite différent.
    - En lfaisant md5(TI) on obtient un md5() unique qui ne pourra jamais ressortir puisque forgé à partir d'un time n'existant plus. Il ne peut non plus être partagé entre deux membres se connectant pile à la même seconde, puisqu'ils ont des id différents, ce qui nous donne la encore un TI différent ne pouvant jamais donner le même md5().

    Je crois que c'est bon. Mais en effet il faudrait faire tout le détail. Y'a un pro des maths dans le coin ?
    C'est pas parce que j'ai tort que vous avez raison.

  13. #13
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par psychoBob
    on obtient un md5() unique qui ne pourra jamais ressortir
    Ben si justement, comme tout nombre fini... Bêtement comme ça je dirais qu'il a une chance sur 2^128 de ressortir, mais en fait un peu plus car il y a des "trous" dans le md5.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    des trous ?
    C'est pas parce que j'ai tort que vous avez raison.

  15. #15
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par psychoBob
    des trous ?
    Si mes souvenirs sont bons tous les nombres de 128 bits ne sont pas des hashes md5, mais je peux me tromper.

  16. #16
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    - En lfaisant md5(TI) on obtient un md5() unique qui ne pourra jamais ressortir puisque forgé à partir d'un time n'existant plus. Il ne peut non plus être partagé entre deux membres se connectant pile à la même seconde, puisqu'ils ont des id différents, ce qui nous donne la encore un TI différent ne pouvant jamais donner le même md5().
    Sauf qu'il existe des collisions dans MD5. Une collision c'est lorsque tu prends deux chaines différentes a et b.
    Que tu les hashes avec MD5, et que le hash est le même.

    Préféres y sha1 si tu flippes tant que cela d'une collision.

    cf http://fr.wikipedia.org/wiki/MD5
    .....
    En 2004, une équipe chinoise découvre des collisions complètes. MD5 n'est donc plus considéré comme sûr au sens cryptographique.
    ....
    bbye

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Et c'est quoi la différence d'utilisation en sha1 et md5() ? C'est simplement les 8 caractères de plus ?
    Pourquoi tout le monde n'utilise pas sha1 à la place de md5() si sha1 est plus sur ?
    C'est pas parce que j'ai tort que vous avez raison.

  18. #18
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par psychoBob
    Et c'est quoi la différence d'utilisation en sha1 et md5() ? C'est simplement les 8 caractères de plus ?
    Pourquoi tout le monde n'utilise pas sha1 à la place de md5() si sha1 est plus sur ?
    Il me semble que sha est moins "ouvert" que md5, c'est un standard US.
    Tant qu'à utiliser sha, autant prendre le 2, il paraît que le 1 a été factorisé... Ceci dit, si le risque de collision est moindre, il n'est pas nul. Il y a toujours des collisions, dans tous les algos de hash imaginables.

  19. #19
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par psychoBob
    Bon au final j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //on prend l'heure de la connexion
     (mais deux membres peuvent se connecter en même temps).
    $numeroConnexion=time();
     //On concatène le moment de la connexion à l'id du membre (forcément unique)
    $numeroConnexion=$numeroConnexion.$id;
     //on recrytpe la chose obtenue afin d'avoir un numéro
     absolument unique
    $numeroConnexion=md5($numeroConnexion);
    Pour la concaténation, je n'ai pas fait d'erreur ? ça vous semble bon dans l'idée, pour avoir un md5() absolument unique ?
    Question bete : tu as un $id membre qui est unique... donc pourquoi ne pas concatener l'$id du membre (formaté sur un nombre fixe de chiffre) a une chaine "md5isée" provenant de time() ?

    genre donc :

    $id.md5(time);

    avec $id de la forme "0001", si tu peux avoir au maximum 9999 membre sur ton site.

    Comme ca : la premiere partie du nombre implique que ca sera unique pour chaque membre (pas de collision intermembre)
    La 2eme partie du nombre permet d'assurer l'unicité au niveau d'un membre (au cas ou il s'amuse a donner son login/pass a un ami et a se connecter au meme moment... deja vachement rare hein ;o)

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Parce que là le gars qui récupère ça a l'id du membre en clair si j'ai bien compris ton idée. Tu me diras il faudrait que le pirate le distingue dans la chaine mais tout de même.

    **edit**
    Bon en fait concaténer un time() unique passé en md5() à un id unique passé en md5() à priori donnera une chaine de caractère absolument unique, ce qui n'est pas forcément le cas si on repasse cette chaine par md5() cette dernière opération pouvant réserver des surprises.

    Mais par contre une chaine de 64 caractères ça commence à faire long pour aller chercher dans la base le compte qui correspond au numéro de session.
    C'est pas parce que j'ai tort que vous avez raison.

Discussions similaires

  1. Générer des numéros de téléphone aléatoire
    Par Rodrigue dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/10/2012, 23h07
  2. Réponses: 17
    Dernier message: 22/11/2008, 15h53
  3. Réponses: 1
    Dernier message: 30/06/2008, 15h40
  4. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  5. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35

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