Soyez le premier à donner votre avis sur cette source.
Vue 15 051 fois - Téléchargée 658 fois
//M2K.JS //la fonction de hachage côté client function m2k_c(i,s,sl) { d=new Array(64); e=s.charCodeAt(i); t=353+e+sl; t=(t%2==0)?t+33:t; u=33+i; for(n=0;n<64;n++) d[n]=t%(n+u); return d; } function m2k(s) { k=new Array(32); c=new Array(32); sl=s.length; s=s+s.substr(0,1); a=m2k_c(0,s,sl); for(n=0;n<32;n++) k[n]=0; for(i=0;i<sl;i++) { b=m2k_c(i+1,s,sl); for(n=0;n<32;n++) { c[n]=a[n]*b[(n+i+32)%32+32]; k[n]+=c[n]; } a=b; } var h=''; for(n=0;n<32;n++) h+=(k[n]%16).toString(16); return h; } //M2K.PHP //la fonction de hachage côté serveur(doit être la même que côté client) <? function m2k_c($i,$s,$sl) { $e=ord(substr($s,$i,1)); $t=353+$e+$sl; $t=($t%2==0)?$t+33:$t; $u=33+$i; for($n=0;$n<64;$n++) $d[$n]=$t%($n+$u); return $d; } function m2k($s) { $sl=strlen($s); $s=$s.substr($s,0,1); $a=m2k_c(0,$s,$sl); for($i=0;$i<$sl;$i++) { $b=m2k_c($i+1,$s,$sl); for($n=0;$n<32;$n++) { $c[$n]=$a[$n]*$b[($n+$i+32)%32+32]; $k[$n]+=$c[$n]; } $a=$b; } for($n=0;$n<32;$n++) $h.=dechex($k[$n]%16); return $h; } ?> //INDEX.PHP //la page qui contient le formulaire pour taper le log et le passe qui sera envoyé haché <? //en tete commune ?> <html> <center> <? //si un login a été envoyé if(isset($login)) { //ici le mot de passe c est admin, j ai pas exigé de login car ca sert a rien pour la demo //sinon c est ici que vous choppez votre mot de passe apres avoir intérogé une base de donnée $sqlpassword="admin"; //on inclue le script php qui contient la meme fonction de hachage que le javascript de la premiere page include("m2k.php"); //on encode le préfixe et le mot de passe, comme la premiere page l a fait en javascript(voir en bas) $mpassword=m2k($prefix.$sqlpassword); //on compare les 2 qui doivent etre égaux if($password==$mpassword) { //on affiche un message pour dire que c est bon echo "bonjour $login vous etes parvenu a vous connecter avec succès<br> sans faire circuler votre mot de passe en clair sur le réseau.<br>(Grâce à la méthode get du formulaire qui de passer les variables dans l adresse,<br> vous pouvez vous pouvez constater que password est haché,<br> votre mot de passe ne figure nul part et passe nul part en clair)"; //apres il faut gérer ca avec des variables de session //pour les initiés pas de pb, pour les novices allez sur http://www.php.net/manual/fr/ //c est un tres bon manuel pour apprendre php. } //si les 2 sont pas egale c est po bon else { //donc on affiche un message aussi echo "ce n est pas le bon mot de passe regardez la source d'index.php"; } } else { ?> <!-- on inclue le javascript qui contient l algorithme de hachage--> <script language=javascript src=m2k.js></script> <b>Accès : </b><br> <!-- il y a d abord un 'faux' formulaire dans lequel l utilisateur met son log et son pass attention ! ces données ne sont pas envoyés --> <form> Login :<br> <input type=text name=f_name size=17 maxlength=16 id=f_login><br> Passe :<br> <input type=password name=f_password size=17 maxlength=16 id=f_password><br> </form> <!-- le vrai formulaire i je fais expres de mettre une méthode get pour que vous puissiez voir les paramètres dans l url--> <form action=index.php method=get> <!--login et password sont vide il vont etre rempli au moment du clic sur ok --> <input type=hidden name=login value="" id=sf_login> <input type=hidden name=password value="" id=sf_password> <!-- on envoi un préfix qui est le nombre de seconde unix, il servir pour composer le mot de passe haché --> <input type=hidden name=prefix value=<? echo time(); ?> id=sf_prefix> <!-- LA ligne LA plus importante Le bouton d envoi du formulaire prend le nom du faux formulaire, le met dans le vrai enfin il colle le préfixe(nombre de seconde unix) et le mot de passe, cette chaine va etre haché grace a la fonction de hachage contenu dans le javascript inclu au dessus le résultat est stocké dans le champ sf_password, le vrai mot de passe crypté en fonction de la date, donc pour un meme mot de passe, on aura toujours un résultat haché différent ! --> <input type=submit value="ok" Onclick="getElementById('sf_login').value=getElementById('f_login').value;getElementById('sf_password').value=m2k(getElementById('sf_prefix').value+getElementById('f_password').value);"> </form> <? }//fin si pas de login encore rentré //pied commun ?> </center> </html>
et en suite il n'aura qu'a entré le hash dans le champs password et ça marchera parfaitement.
disont que t'a source est un premier filtre pour les pirate du dimanche, mais c'est quand même tout a fait vulnérable.
pour l'unicité de l'utilisation du préfixe, l suffit de le stocker dans le profil de l'utilisateur et de vérifier à la connexion suivante que le préfixe est différent.
Ce qui me pose davantage problème, c'est que, sauf erreur de ma part, ce système ne permet pas aux utlisateurs de choisir eux mêmes et de modifier leur mot de passe puisqu'il n'est pas décodé avant stockage.
Le système de hashage n'est pas adpaté dès lors qu'on offre ce genre de fonctionnalités ?
Le préfixe ne dépend pas de la date.
Le code doit être amélioré sur 2 points.
1 / l'interdiction d'utiliser 2 fois le même préfixe.
2 / il n y a pas de précision sur les numéros de sessions, une fois identifié il faut regenerer un nouveau id de session (session_regenerate() il me semble. Ceci afin d'éviter que le pseudo hacker utilise le numero de session qui a servi a l'authentification.
bonne idée que cette histoire de préfixe, en améliorant un chouilla ton script on doit pouvoir sécuriser correctement l'identification
puisque le préfixe dépend de la date, si par exemple on prends comme précision la minute, ça ne laisse qu'une minute au hackeur pour sévir
si en plus de ça on mémorise les préfixes utilisé, pendant par exemple plus d'une minute, le hackeur ne pourra pas se logger
mais il faut alors que le préfixe dépende aussi du login, sinon personne ne peut se logger pendant une minute...
de plus apparemment dans ton script au dessus les identifiants sont stockés en clair, le mieux est donc un double cryptage : stockage en crypté, ajout d'un préfixe à cet id crypté puis cryptage de l'ensemble
coté client c'est pareil on crypte une fois, on ajoute le préfixe et on recrypte avant d'envoyer
vous en pensez quoi ?
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.