Clavier virtuel anti-keylogger

Eléphant du PHP | 52 Messages

08 janv. 2012, 21:01

Bonjour à tous,

J'essaie de faire une page de connexion anti-keylogger, " (enregistreurs de frappe clavier" en français).
J'ai écrit ce code javascript très simple et il fonctionne bien.

Vous pouvez tester ma page ici : http://test1111.site90.com/

Par contre, rien n'empêche l'employé de taper le mot de passe sur le vrai clavier de l'ordinateur sans utiliser mon clavier virtuel,
et dans ce cas, ma protection ne sert plus à rien...

Voyez-vous comment je peux vérifier et être sûr que le mot de passe a été bien été saisi uniquement avec le clavier virtuel ?

Je coince... #-o

[edit:] J'ai TROUVE!! je rajoute un readonly="readonly" dans le champ "motdepasse". ça marche nickel! :P


Voici le code javascript :
<html>
<head><title>Clavier Test</title>
<script type="text/JavaScript">
function clavier (valeur) {
document.forms["changer"].elements["motDePasse"].value=document.forms["changer"].elements["motDePasse"].value+valeur;
}
</script></head>
<body>
<h2>Clavier de test</h2>
<form name="changer" method="post" action="verifier.php">
Votre login:&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" id="login" name="login" /><br /><br />
Mot de passe: <input type="password" name="motDePasse" id="motDePasse" readonly="readonly" /><br /><br />
<input type="button" id="A" value="A" onClick="clavier('A');">
<input type="button" id="B" value="B" onClick="clavier('B');">
<input type="button" id="C" value="C" onClick="clavier('C');">
<input type="button" id="D" value="D" onClick="clavier('D');">
<input type="button" id="E" value="E" onClick="clavier('E');">
<input type="button" id="F" value="F" onClick="clavier('F');"> 
<br />
<input type="button" value="1" id="c1" onClick="clavier(1);">
<input type="button" value="2" id="c2" onClick="clavier(2);">
<input type="button" value="3" id="c3" onClick="clavier(3);"><br />
<input type="button" value="4" id="c4" onClick="clavier(4);">
<input type="button" value="5" id="c5" onClick="clavier(5);">
<input type="button" value="6" id="c6" onClick="clavier(6);"><br />
<input type="button" value="7" id="c7" onClick="clavier(7);">
<input type="button" value="8" id="c8" onClick="clavier(8);">
<input type="button" value="9" id="c9" onClick="clavier(9);"><br />
<input type="button" value="0" id="c0" onClick="clavier(0);"><br /><br />
<input type="submit" value="se connecter" />
</form>
Modifié en dernier par Jim125 le 10 janv. 2012, 11:44, modifié 7 fois.

Eléphant du PHP | 52 Messages

08 janv. 2012, 21:04

La page de vérification est également très simple.
Si vous avez des idées, des suggestions, des critiques, n'hésitez pas à rajouter quelques lignes de code pour l'améliorer ! :)

Vous pouvez tester ma page ici : http://test1111.site90.com

Voilà, je pense que les keyloggers ne pourront pas choper le mot de passe maintenant. (un sniffer oui, mais c'est pas le boulot qu'on m'a demandé) Mais si vous pensez que mon script est bidon, ne vous génez pas pour le dire. Toute critique peut être utile. Je le testerai demain avec plusieurs keyloggers.
<?php
$login=htmlspecialchars($_POST['login'], ENT_QUOTES);
$message = ''; // Message à afficher à l'utilisateur
// Si le tableau $_POST existe alors le formulaire a été envoyé
if(!empty($_POST))
{
// Le login est-il rempli ?
if(empty($_POST['login']))
{
$message = 'Veuillez indiquer votre login svp !';
}
// Le mot de passe est-il rempli ?
elseif(empty($_POST['motDePasse']))
{
$message = 'Veuillez indiquer votre mot de passe svp !';
}
// Le login est-il correct ?
elseif($_POST['login'] !== "en516")
{
$message = 'Votre login est faux !';
}
// Le mot de passe est-il correct ?
elseif($_POST['motDePasse'] !== "FADEC8864")
{
$message = 'Votre mot de passe est faux !';
}
else
{
// L'identification a réussi
$message = 'Bienvenue '.$login.' !';
}
}
echo $message;
?>

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2012, 04:10

Il faudrait que les touches apparaissent dans un ordre différent à chaque connexion/rafraichissement de la page. Cela éviterait que si on mémorise les positions des click on puisse retrouver les caractères rentrés.

ViPHP
xTG
ViPHP | 7331 Messages

09 janv. 2012, 08:01

Si tu veux être sûr que ce soit le clavier qui a été utilisé.
Tu peux ajouter un champ hidden qui est rempli en même temps que ton champ password.
Pour plus de sécurité tu peux avant de le transmettre exécuter une fonction de hashage dessus.

Ou bien un autre champ de type password et jouer sur le CSS pour ne pas qu'il s'affiche.

Ainsi au traitement du formulaire tu peux comparer les deux.

Eléphant du PHP | 52 Messages

09 janv. 2012, 12:30

... Cela éviterait que si on mémorise les positions des click on puisse retrouver les caractères rentrés.
merci de la suggestion, facile et léger à réaliser en CSS/Javascript. Je vais l'ajouter au cas où.
Par contre j'ai testé + de 30 keyloggers/trojans et aucun n'est capable d'enregistrer la position des clics souris à l'écran. Tu as vu ça où ?

Eléphant du PHP | 52 Messages

09 janv. 2012, 12:42

Pour plus de sécurité tu peux avant de le transmettre exécuter une fonction de hashage dessus.
en quoi un hashage du mot de passe avant l'envoi apporterait t-il plus de sécurité ? :shock:

ViPHP
xTG
ViPHP | 7331 Messages

09 janv. 2012, 14:03

Il transiterai pas en clair... J'ai jamais dit que c'était la sécurité ultime par contre. ;)

Eléphant du PHP | 52 Messages

09 janv. 2012, 15:20

Il transiterai pas en clair... J'ai jamais dit que c'était la sécurité ultime par contre. ;)
C'est même pas une sécurité du tout. J'ai bien peur que tu ne comprennes pas comment agit un sniffer, ou un man in the middle.

Imaginons que tu hashes le mdp en Javascript avant de l'envoyer : en SHA-256 le mdp FADEC8864 donne : b1d9a033ab1d1be0d8a09f708efe248b55c3303f75f1c0291fc050fe7ff8b98d

Si le pirate sniffe ton hash, il n'a plus qu'a le copier coller dans la page login pour se connecter. (sauf sur ma page car le champ password est en lecture seule).Il n'a même pas besoin de connaître le mot de passe si il a sniffé le mdp hashé. Tu comprends ? :)

Peu importe que le mot de passe transite en clair, chiffré, encodé en base64 ou hashé. Un pirate qui récupérerait ton mot de passe "hashé" n'aurait qu'a le taper telquel pour se connecter au site. Hasher un mot de passe n'est utile que pour le stocker en base de donnée. Attention à cette notion de sécurité.
Le seul moyen pour que ton mot de passe ne transite pas en clair c'est le HTTPS.
J'ai bien précisé que le but de mon script est de protéger des keyloggers. Pas des sniffers.
En tous cas, merci de tes suggestions, c'est sympa d'échanger sur le sujet. :wink:

Eléphant du PHP | 209 Messages

09 janv. 2012, 15:41

Salut,

Tu peux jeter un œil sur le site de la banque postale. Ils ont fait un système de saisie de mot de passe sans clavier et sans clic qui pourrait peut-être t'intéresser.
En gros, tu as un clavier virtuel aléatoire et tu saisies ton mot de passe en passant ta souris au dessus des chiffres (pas besoin de clic). Le champ se remplit automatiquement à partir de ça.

++

Eléphant du PHP | 245 Messages

09 janv. 2012, 16:26

Au niveau sécurité, sur la page de réception du formulaire tu envoies un jeton (ou token) par SMS ou par email généré aléatoirement (valide seulement quelques instants ) et que l'utilisateurdoit rerentré pour finaliser son authentification.

Mammouth du PHP | 568 Messages

09 janv. 2012, 17:34

Et si je fais un document.getElementById("motDePasse").readOnly = false; via Firebug ? :lol:

Je désactive le readOnly et je fais ce que je veux ...

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2012, 17:35

Le seul moyen pour que ton mot de passe ne transite pas en clair c'est le HTTPS.
J'ai bien précisé que le but de mon script est de protéger des keyloggers. Pas des sniffers.
Excuse-moi de développer sur un sujet qui ne t'intéresse pas au premier plan mais le https n'est pas le seul moyen : il suffit de concaténer le mdp à un grain de sel à chaque fois différent et de hascher le tout. Ainsi la valeur qui transite dans les tuyaux n'est valable qu'une seule fois pour une session unique.

Concernant le fait de pouvoir loger les coordonnées des click, ce n'est pas difficile à imaginer ... d'ailleurs comme dit plus haut le clavier virtuel de la banque postale en est un bon exemple. Non seulement on a pas besoin de cliquer mais en plus la position des caractères change à chaque fois... sans doute pour se protéger d'autres systèmes de piratage que tu n'as pas encore testés :wink:

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2012, 17:38

Et si je fais un document.getElementById("motDePasse").readOnly = false; via Firebug ? :lol:

Je désactive le readOnly et je fais ce que je veux ...
Oui bon mais c'est l'utilisateur qui doit le faire. On ne peut pas protéger totalement les gens contre eux-mêmes, ils peuvent aussi bien donner leur mot de passe à qui ils veulent sans passer par l'informatique.

Eléphant du PHP | 52 Messages

09 janv. 2012, 17:48

Et si je fais un document.getElementById("motDePasse").readOnly = false; via Firebug ? :lol:
Je désactive le readOnly et je fais ce que je veux ...
Oui tu as raison, mais là c'est juste un clavier accessible pour les employés, pour qu'ils ne se fassent pas avoir par un keylogger.
Donc aucune chance qu'ils essaient eux-même de bypasser ça avec firebug.
Mon readonly est là pour qu'il ne tapent pas machinalement leur mdp avec le vrai clavier (par habitude en fait).

Par contre, merci de ta remarque sur Firebug. Dans d'autres circonstances, c'est un outil très efficace effectivement. :wink:

Eléphant du PHP | 52 Messages

09 janv. 2012, 17:56

Excuse-moi de développer sur un sujet qui ne t'intéresse pas au premier plan mais le https n'est pas le seul moyen : il suffit de concaténer le mdp à un grain de sel à chaque fois différent et de hascher le tout. Ainsi la valeur qui transite dans les tuyaux n'est valable qu'une seule fois pour une session unique.
Intéressant ça au contraire! (même si ce n'est pas de l'anti-keylogger, ça peut servir)
Mais je demande à vérifier : Tu peux nous montrer une exemple concret en quelques lignes de code ?