IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Java - Java Swing: Passwortfelder



Java Swing: Passwortfelder

Passworteingaben lassen sich mit JPasswordField leicht verdecken.


Autor: Patrick Faes (dreamer)
Datum: 11-09-2007, 10:31:08
Referenzen: siehe Text
Schwierigkeit: Fortgeschrittene
Ansichten: 15951x
Rating: 7 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



1. Einführung

Wie jede andere Programmiersprache bietet auch Java mit der Klasse JPasswordField eine Möglichkeit an um Passwörter verdeckt einzugeben, so dass keiner diese heimlich mitlesen kann. Anstatt den eingegebenen Passworttext anzuzeigen werden so genannte Maskierungszeichen verwendet (standardmäßig sind dies Sternchen).

Das sieht dann etwa so aus:



Die Klasse JPasswordField erweitert die Klasse JTextField, ein normales Eingabefeld für Text. Die Klasse JTextField besitzt ebenfalls eine Methode setEchoChar() die den eingegebenen Text mit Maskierungszeichen darstellt. Deshalb wird oft behauptet JPasswordField wäre einfach nur ein JTextField wobei das Darstellen des Textes mittels Maskierungszeichen standardmäßig aktiviert ist. Dies stimmt aber nicht. Das JPasswordField ist darauf zugeschnitten Passwörter zu schützen. So ist es nicht möglich die eingebenen Passwörter sofort zu kopieren, was bei der Klasse JTextField auch mit der Verwendung von Maskierungszeichen noch immer möglich ist.

Dieser Artikel möchte zeigen wie die Klasse JPasswordField verwendet wird. Der Artikel erhebt dabei nie den Anspruch alle Methoden und Eigenschaften der Klasse zu erläutern, bzw. vollständig zu sein. Stattdessen wird auf die eigentliche Verwendung in der Praxis der Klasse eingegangen.



2. Ein Passwortfeld erstellen

Um ein Passwortfeld erstellen zu können, muss erst mal die Klasse JPasswordField importiert werden.
import javax.swing.JPasswordField;
Nachher können wir ein Passwortfeld erstellen:
JPasswordField passwortFeld = new JPasswordField();
Dies erstellt ein leeres Passwortfeld. Die Größe des Passwortfeldes unterscheidet sich je nach verwendetem Layout-Manager. Alternativ kann die Größe des Feldes, sprich die Anzahl der anzuzeigenden Zeichen mit der Methode setColumns() festgelegt werden.
passwortFeld.setColumns(15);
In diesem Beispiel wird die neue Länge auf 15 eingestellt. Beachten Sie aber dass damit nicht verhindern lässt dass ein Layout-Manager das Passwortfeld neu dimensioniert, bzw. ausdehnt.

Achtung: die Größe des Passwortfeldes wird in "Anzahl Zeichen" festgelegt. Dabei basiert sich der Java-Interpreter aber auf die maximale Länge eines Zeichens, denn nicht alle Zeichen sind gleich lang. Im Klartext: da z.B. ein Komma ( , ) weniger Platz einnimmt als ein großgeschriebenens A, können je nach Breite der einzelnen Zeichen eventuell auch mehr als 12 Zeichen in unserem Passwortfeld Platz haben. Zudem verhindert die Größenangabe des Passwortfeldes nicht dass auch Passwörter eingegebenen werden die Länger als 12 Zeichen sind. (Ich komme später noch darauf zurück.)

Ein Passwort kann mit der Methode setText() eingestellt werden:
passwortFeld.setText("Passwort");
Dies könnte zum Beispiel dazu verwendet werden um Anwender, die schon durch dem Login im Betriebssystem erkannt wurden, das Einloggen zu erleichtern. Aber es ist ebenso möglich um das Passwort eines kürzlich eingelogten Anwenders oder das Passwort des letzten Logins erneut zu verwenden. Diese Vorgehensweise hat aber einen Haken: wenn dabei nicht zweifellos festgestellt werden kann dass es sich um denselben Anwender handelt, geht die Verwendung eines Passwortfeldes an seinem Ziel vorbei.

Standardmäßig werden alle Eingaben von Sternchen ( * ) maskiert. Wenn Sie ein anderes Zeichen als Ausgabe verwenden möchten, so können Sie dies mit der Methode setEchoChar() ändern:
passwort.setEchoChar('+');

In diesem Beispiel werden anstatt der Sternchen Pluszeichen ausgegeben. Sie können eigentlich jedes nur erdenkliche Zeichen dafür verwenden. Beachten Sie halt das es nur ein Zeichen sein darf (also keine Kombination wie z.B. "+|") und dass dies von einfachen Anführungszeichen umgeben sein muss.

Folgende Beispiele sind alle gültig:
passwortFeld.setEchoChar('^');
passwortFeld.setEchoChar('/');
passwortFeld.setEchoChar('b');
passwortFeld.setEchoChar('3');


3. Passwort auslesen

Anfangs ließen sich Inhalte aus einem Passwortfeld auslesen mit der Methode getText() die von der Klasse JTextField geerbt wurde. Diese gibt den Inhalt als String zurück:
String passwort = passwortFeld.getText();
Passwörter sollen aber gut geschützt werden. Deshalb ist diese Methode veraltet. Sie kann zwar weiterhin verwendet werden, jedoch gibt der Compiler beim Compilieren eine Warnung aus dass die Methode veraltet ist. In zukünftigen Versionen von Java wird die Methode dann nicht mehr funktionieren und muss das Programm geändert werden.

Die empfohlene Methode um Inhalte eines JPasswordFields auszulesen ist getPassword(). Diese liefert aber keine Zeichenkette, sondern ein Array aus einzelne Zeichen zurück. Daraus das Passwort zu erstellen, ist viel einfacher als mann denkt:
char[] zeichen = passwortFeld.getPassword();
String passwort = new String(zeichen);
Aus Sicherheitsgründen werden die Methoden des JTextFields copy(), cut(), usw. durch JPasswordField nicht mehr unterstützt.


4. Minimal- und Maximallänge eines Passworts bestimmen

Selbst bietet JPasswordField keine Möglichkeit an die minimale, bzw. maximale Länge eines Passworts festzulegen. Da kann aber nachgeholfen werden.

Beim Auswerten der Eingabe im Passwortfeld, kann die Länge des Passworts ausgelesen werden. Dazu werden wir mit der Methode getPassword() das Passwort auslesen, welche als Array einzelner Zeichen (char) zurückgegeben wird, wonach wir schauen wieviele Zeichen eingegeben wurden.
char[] passwort = passwortFeld.getPassword();
int laenge = passwort.length;

if (laenge >= 6)
{
	
}
else
{
	
}
Wenn das Passwort mindestens 6 Zeichen lang ist, dann kann das Programm weiter ausgeführt werden, ansonsten könnte eine Warnung ausgegeben werden.

Die Überprüfung ob das Passwort zu lange ist, könnte genauso gelöst werden. Jedoch empfiehlt es sich das Eingeben eines zu langen Passwortes gleich vorzubeugen. Dazu verwenden wir das KeyEvent. Es handelt sich dabei um das "Tastenereignis", bzw. Code der ausgeführt wird wenn eine Taste betätigt wurde. Importieren Sie dazu die folgenden Klassen, bzw. Interfaces:
import java.awt.event.KeyListener;
java.awt.event.KeyEvent;
Fügen Sie dem Passwortfeld ein KeyListener zu mit der Methode addKeyListener(). Der KeyListener stellt folgende Methoden zur Verfügung:
public void keyTyped(KeyEvent evt)
{
//Taste wurde betätigt
}

public void keyPressed(KeyEvent evt)
{
//Taste wird gedrückt gehalten
}

public void keyReleased(KeyEvent evt)
{
//Taste wurde losgelassen
}
Sie können dann das Passwort auslesen, dessen Länge bestimmen und, falls das Passwort zu lange ist, ein neues Passwort einstellen das aus z.B. die ersten 10 Buchstaben der eigentlichen Eingabe besteht (wobei 10 dann die maximale Länge des Passworts ist).
char[] passwort = passwortFeld.getPassword();
int l = passwort.length;

if (l > 10)
{
	char[] gekuerzt = new char[10];

	for (int i = 0; i < 10; i++)
	{
		gekuerzt[i] = passwort[i];
	}

	passwortFeld.setText(new String(gekuerzt));
}
Dieser Code k&oum;nnen Sie dann in allen Ereignissen verwenden um so sicher zu stellen dass der Benutzer niemals ein zu langes Passwort eingibt.
Übersicht von JPasswordField
Übersicht von KeyListener


paedubucher
Professonial
Beitrag vom:
16-09-2007, 17:20:53

An Swing interessiert

Ein schöner Artikel; übersichtlich und korrekt. Ein Screenshot von einem "echten" Swing-GUI wäre aber dennoch schön gewesen ;-)

Ich selber schiebe schon seit längerer Zeit ein Artikel über das GridBagLayout vor mir her, das ist im Zusammenhang mit Textfelder auch sehr interessant.

Übrigens: In der letzten Zeile ist dir ein &oum; reingerutscht, da fehlt wohl das "l" vor dem Semikolon...

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04502
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16551
Queueeinträge:06233
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1131
Comments: 0