Securite anti piratage envoi de mot de passe crypte sans ssl

Soyez le premier à donner votre avis sur cette source.

Vue 14 901 fois - Téléchargée 635 fois

Description

Si le serveur web sur lequel vous vous connectez n'est pas sécurisé(c est souvent le cas, sinon l'url commence par https ou lieu de http). Toutes les données envoyées passent en clair sur le réseau. Faites le test, invitez vos amis(ou ennemis) a un réseau local connecté à un routeur internet, utilisez un sniffer(logiciel pour voir tous les paquets qui passent sur le réseau) avant qu'ils se logguent sur leur site web préféré, et vous aurez leur mot de passe !
Pour les webmasters c est un problème, surtout si leur hébergeur ne propose pas SSL.
Voici un script avec un petit algorithme de hachage fait maison(vous pouvez utilisez md5 mais le javascript a inclure sera très long et il faut que la norme RFC de la fonction md5 côté client et serveur soit la meme).
Ce script permet de faire transiter un haché du mot de passe concaténé avec un préfix qui varie selon la date,
ainsi le haché envoyé ne sera jamais le même.

Source / Exemple :


//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>

Conclusion :


Ceci est ma première contribution,
c'était histoire d'envoyer une contribution :)
j'espère qu'elle est pas trop naz :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

kertimanoff
Messages postés
76
Date d'inscription
samedi 3 décembre 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
c'est une solution d'utiliser js pour hacher le passwd coté client afin qu'il ne transite pas clairement sur le réseau, mais un pirate aguéri enregistrera ta page de connexion sur son pc, modifira le JS pour qu'il ne hach rien du tout, il mettra l'url compléte de la page a poster dans l'action du formulaire.
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.
stephswin
Messages postés
2
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
26 juin 2007
-
Bonsoir,

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 ?
cs_kalachnikov
Messages postés
16
Date d'inscription
samedi 5 juin 2004
Statut
Membre
Dernière intervention
23 juin 2004
-
3 ème point / concernant le stockage en clair, il faudrait également penser a vider les champs f_login et f_password avant la soumission du formulaire (en jscript genre document.getElementById('f_password').value = '';)
cs_kalachnikov
Messages postés
16
Date d'inscription
samedi 5 juin 2004
Statut
Membre
Dernière intervention
23 juin 2004
-
Le timestamp servant a générer le préfixe n'est qu'un exemple de génération aléatoire.
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.
endlersman
Messages postés
1
Date d'inscription
samedi 26 mai 2007
Statut
Membre
Dernière intervention
9 juin 2007
-
bonjour

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.

Du même auteur (cs_kalachnikov)