Securite anti piratage envoi de mot de passe crypte sans ssl

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

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)