Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/05/2006, 00h15   #1
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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 :
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h18   #2
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
tu n'aimes pas les sessionID générées par PHP ?
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h22   #3
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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 :
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h25   #4
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par psychoBob
Ceci dit en effet pourquoi ne pas prendre l'id de session, mais je le récupère comment ?
Ben...
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h27   #5
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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 :
$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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h28   #6
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
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...
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h39   #7
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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 :
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h42   #8
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
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.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 00h46   #9
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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 :
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 01h00   #10
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bon au final j'ai fait ça :
Code :
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 08h37   #11
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
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.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 11h10   #12
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 11h30   #13
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
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.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 11h38   #14
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
des trous ?
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 11h41   #15
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
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.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 12h22   #16
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Citation:
- 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
Citation:
.....
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
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 12h31   #17
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 12h36   #18
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
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.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 12h42   #19
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Citation:
Envoyé par psychoBob
Bon au final j'ai fait ça :
Code :
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)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 13h04   #20
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
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.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h21.


 
 
 
 
Partenaires

Hébergement Web