PHP AJAX – HTTP Identification avec Cryptographie Asymétrique
Une identification PHP/AJAX utilisant la Cryptographie Asymétrique
Voila une maniÚre d’aborder AJAX, on va essayer de mettre au point un systÚme d’identification
des utilisateurs avec PHP/MySQL, mais aussi en utilisant
de l’AJAX histoire de rester dans le web 2.0 …de plus pour agrémenter un peu les choses on utilisera une technique de cryptographie asymetrique tiré de RSA, cela peut être utile si vous n’avez pas les moyens ou pas envie d’acquerir une clef ssh valide.
Principe de la Cryptographie Asymétrique
En gros, dans notre cas,
On a un mot de passe crypteé en MD5 en base de donnée. Le serveur génere une clef publique qu’il garde en session et l’envoi au client, cette clef sera le facteur commun entre le serveur et le client.
Notre client envoi la clef publique, le mot de passe haché une premiere fois avec l’algorithme MD5, et une deuxieme fois avec la clef publique.
Donc le serveur recoit un mot de passe haché avec la clef publique, et la clef publique, il n’a plus qu’a verifier que la clef publique envoyée est bien identique à la sienne gardeée en session, et recuperer le mot de passe crypté en MD5 de la base de donnée, le hacher avec la clef publique et verifier que les deux mots de passe (celui envoyé par le client haché avec la clef publique, et celui recuperé de la DB hacher avec la clef publique) correspondent.
Cahier des charges :
Soyons pro un cahier des charges peut etre interessant histoire de savoir ou on met les pieds.
Notre projet visera la simplicité, (…je ne suis pas reponsable si vous vous faites hacker !! lol …)
- Tournera sur Firefox et Internet Explorer
- Les utilisateur n’ayant pas activé JS pour X raisons, pourront quand meme se logger ( ou non … a vous de voir)
- Une petite console, histoire de voir les échanges client serveur
- je reflechis !
Prerequit :
On utilisera deux bibliotheques permettant un hash md5, une en Javascript et l’autre en PHP, elle sont dans l’archive.
C’est parti !
Je ne vais pas detailler pas à pas le projet, juste donner la methode … (je n’ai pas dis non plus que c’etait la meilleure !)
pourquoi ? … parce qu’au moment ou j’ecris ces lignes, j’ai faim … ensuite parce que je laisse les sources du projet,
puis faire des petites recherches personnelles c’est le mieux.
Le Client
Pour la partie client, en premier, on va initialiser une clef publique qui sera envoyée au serveur par l’intermediaire du formulaire
-
session_start();
-
$_SESSION[‘cle’] = uniqid(mt_rand(), true); // génération d’une clé publique unique
maintenant on va mettre en place un formulaire qui sera envoyé seulement apres avoir recu l’accord de la methode
javascript httpRequest(), qui, elle, acceptera l’envoi du formulaire seulement si l’utilisateur n’a pas activé Javascript, dans le cas
contraire, elle utilisera la methode HTTPRequestXML pour envoyer les informations du formulaire au serveur
-
<form method="POST" action="serveur.php" id="formCrypt" onsubmit="return httpRequest()">
-
<input type="hidden" id="js" name="js" value="0"/>
-
<label>
-
<input type="text" id="cle" name="cle" value="<?=$_SESSION['cle']?/>" size="33" disabled/>
-
Clef publique<br />
-
</label>
-
<label>
-
<input type="text" id="username" name="username" size="33"/>
-
Nom d’utilisateur<br />
-
</label>
-
<label>
-
<input type="password" id="password" name="password" size="33"/>
-
Mot de passe<br />
-
</label>
-
<input type="submit" id="submit" name="submit" value="Connexion Sécurisée"/>
-
</form>
La methode httpRequest, est en fait celle qui va gérer les requêtes avec le serveur, seulenemt avant d’envoyer la requête,
on a besoin d’hacher le mot de passe avec la clef publique generée au préalable.
-
function httpRequest() {
-
var request;
-
var p, u, c;
-
-
// instance de l’objet pour la communication avec le serveur
-
if ( window.XMLHttpRequest ) {
-
request = new XMLHttpRequest();
-
request.overrideMimeType(‘text/xml’); // force l’en-tete des reponses en XML
-
} else if ( window.ActiveXObject ) {
-
request = new ActiveXObject("Microsoft.XMLHTTP");
-
}
-
-
// impossible d’utiliser AJAX
-
if (!request) {
-
return true; // envoi du formulaire normal !
-
}
-
-
// — Traitement des données du formulaire
-
u = $(‘username’);
-
p = $(‘password’);
-
c = $(‘cle’);
-
-
// hachage du password avec la clef publique (le mdp est aussi haché en md5)
-
p.value = hex_hmac_md5(c.value, hex_md5(p.value));
-
-
// — Traitement des reponses du serveur
-
request.onreadystatechange = function() { traitement(request) }
-
-
request.open(‘POST’, ’serveur.php’, true); // préparation de la requête
-
request.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);
-
request.send(‘username=’+u.value+‘&password=’+p.value+‘&cle=’+c.value+‘&js=1′); // envoi de la requête
-
-
return false; // évite l’envoi du formulaire
-
}
Donc maintenant on est prêt a envoyer une requete au serveur avec un mot de passe crypté qui nous evitera ainsi de se faire sniffer par des
méchants pirates !; la methode traitement(), elle, reagit aux reponses du serveur
-
function traitement( request ) {
-
// vérification de l’état de la requête ( 4 = terminée )
-
switch (request.readyState) {
-
case 0 : // 0 non initialisé
-
affiche(‘requête non initialisée !’)
-
break;
-
case 1 : // en cours de chargement
-
affiche(‘requête en cours de chargement …’)
-
onLoad();
-
break;
-
case 2 : // chargée
-
affiche(‘requête chargée !’)
-
offLoad();
-
break;
-
case 3 : // en cours d’interaction avec le serveur
-
affiche(‘requête en cours de d\’intéraction avec le serveur …’)
-
break;
-
case 4 : // terminée
-
affiche(‘requête terminée !’);
-
if ( request.status == 200 ) {
-
reponse(request.responseXML);
-
} else
-
affiche(‘Un problème est survenu avec la requête’);
-
break;
-
}
-
}
Le serveur
Voyons un peu comment le serveur doit nous retourner les reponses,
Deja on veut de l’AJAX, donc elles nous seront retournées en XML, javascript manie plutot bien le DOM.
j’utilise une classe pour l’identification que je ne presenterai pas ici, elle sera dans les sources a telecharger
-
// Javascript est actif, Traitement AJAX
-
if ( $js === 1 ) {
-
$con = new Cryptographie($_SESSION[‘cle’]);
-
-
usleep(800000); // simulation de délai en local
-
-
$cle = $con->checkCle($_POST[‘cle’]);
-
if ( $cle ) {
-
$db_mdp = $con->checkUsername($_POST[‘username’]);
-
if ( $db_mdp !== false )
-
$ok = $con->checkPassword($db_mdp, $_POST[‘password’]);
-
}
-
-
$erreurs = $con->erreurs;
-
-
header(‘Content-type: text/xml’);
-
if ( count($erreurs) !== 0 ) {
-
foreach ( $erreurs as $num => $erreur )
-
echo ‘<xml><numero>’.$num.‘</numero><message>’.$erreur.‘</message></xml>’;
-
} else {
-
//$_SESSION['user'] = $_POST['username']; // – on ouvre une session, l’utilisateur est connecté !
-
echo ‘<xml><numero>0</numero><message>CONNEXION_ACCEPTEE</message></xml>’;
-
}
-
} else {
-
// traitement normal
-
echo ‘js n\’est pas actif !‘;
-
}
La console
Dans le cahier des charges on a parlé de créer une console afin de voir un peu comment reagit notre code …
ca sera en fait une simple fonction javascript qui nous permettra de sonder chaque partie du code que l’on souhaite.
-
function affiche(msg) {
-
$(‘console’).innerHTML += "< ?=$_SERVER['REMOTE_ADDR']?> : "+msg+"<br />";
-
}
Cryptographie PHP/MySQL -AJAX – RSA
Tableau de bord
Share and Enjoy
















17 mars 2008 at 21:46
bonsoir,
c trés bien comme script mais je vois que c pas terminer,
je pense que il faut mettre une redirection et un entete qui controle la session,
on tous cas merci bcp
bonne chance