Bonsoir tout le monde,

Je veux créer un JPasswordField un peu plus sécurisé. L'idée est d'interférer le fonctionnement des keyloggers en générant des évènements de KeyStroke aléatoires. Quand l'utilisateur place le curseur dans le JPasswordField, le programme crée un thread qui génère des KeyStrokes à l'aide de la classe java.awt.Robot :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Robot robot = new Robot();
nextKey = alphabet[rand.nextInt(ALPHABET_SIZE)];
robot.keyPress(nextKey);
robot.keyRelease(nextKey);
Cette solution marche, le Super Free Keylogger a bien capturé les caractères générés.

Le seul problème est le filtrage des KeyStrokes. Il ne faut pas que les KeyStrokes générés par le robot soient pris en compte par le JPasswordField. C'est-à-dire que le JPasswordField ne garde que les caractères qui sont réellement saisis pas l'utilisateur.

Ma première idée est de créer une sous classe de javax.swing.text.PlainDocument, nommée PasswordDocument et de réimplémenter la méthode insertString. Et je mets un drapeau booléen dans la classe, le drapeau est VRAI quand le robot est entrain de générer des caractères aléatoires, et la méthode insertString retourne immédiatement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
document = new PasswordDocument();
... ... ...
nextKey = alphabet[rand.nextInt(ALPHABET_SIZE)];
document.setFakeStroke(true);
robot.keyPress(nextKey);
robot.keyRelease(nextKey);
document.setFakeStroke(false);
Sinon on appelle la méthode insertString de la classe mère :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
synchronized(lock){
	if(fakeStroke){
		return;
	}
	super.insertString(offs, str, a);
}
Mais après la génération d'un caractère aléatoire, le drapeau est dévenu FAUX immédiatement, la méthode insertString est appelé (par le Event Dispatching Thread de Swing) après la mise à jour du drapeau. Et quand on teste la valeur de fakeStroke dans le code ci-dessus, le if renvoie toujours FAUX, et les caractères qui sont générés par le robot sont affichés dans le JPasswordField aussi.

J'aimerais savoir si quelqu'un a une idée pour résoudre ce problème?

Merci beaucoup et bon week-end.