Passwort Versuche speichern

Zut

Mitglied
Hallo, ich habe ein Programm erstellt, was durch ein Passwort geschützt ist. Man hat drei Versuche das richtige Passwort einzutippen, falls alle Versuche falsch sind wird ein Countdown von 2 Minuten gestartet, wo man das Passwort nicht eintippen kann. Nach den 2 Minuten hat man dann wieder 3 Versuche und kann das Passwort eintippen. Nun kann man aber natürlich auch einfach die App schließen und wieder starten und sofort hat man wieder alle drei Versuche. Kann man das irgendwie ändern, das immer wenn das Programm gestartet wird, geprüft wird, wie viele Versuche noch vom letzten mal übrig waren und man dann auch nur die Versuche wieder hat, bzw. das dann der Countdown weiterläuft, wo er davor unterbrochen worde.
Bitte beschreibt genau eure Idee und zeigt mir dafür den ganzen neuen/bearbeiteten Code(auch was importiert wird)!
Ps: Bin noch nicht so lange mit Java unterwegs.
Vielen dank für eure Ideen und Lösungen!

Java:
        prufen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String pseingabe = textfeld.getText();

                if (pseingabe.equals("...")) { //Hier kann man das Passwort ändern.
                    textfeld.setText("");
                    textfeld.setVisible(false);
                    eingabe.setVisible(false);
                    prufen.setVisible(false);
                    falsch.setVisible(false);

//.......Eigentliche Funktion des Programmes wird gestartet


                } else {
                    textfeld.setText("");
                    versuche--;

                    if (versuche == 1) {
                        falsch.setText("Falsches Passwort! Noch "+versuche+" Versuch.");
                        falsch.setBounds(140, 120, 600, 20);
                        falsch.setVisible(true);
                    }

                    if (versuche == 2) {
                        falsch.setText("Falsches Passwort! Noch " + versuche + " Versuche.");
                        falsch.setBounds(140, 120, 600, 20);
                        falsch.setVisible(true);
                    }

                    if (versuche == 0) {
                        versuche = 3;
                        textfeld.setVisible(false);
                        prufen.setVisible(false);
                        eingabe.setVisible(false);
                        falsch.setText("Falsches Passwort! Zu viele falsche Versuche!");
                        falsch.setBounds(100, 120, 600, 20);
                        falsch.setVisible(true);
                        minuten = 2;
                        sekunden = 0;


                        Timer timer = new Timer(1000, new ActionListener() {
                            @Override
                            public void actionPerformed(ActionEvent e) {
                                zeittext.setText("02:00 min");
                                zeittext.setVisible(true);


                                if (sekunden == 0 && minuten == 0) {
                                    zeittext.setText(String.format("%02d:%02d min", minuten, sekunden));
                                    ((Timer) e.getSource()).stop();
                                    falsch.setVisible(false);
                                    zeittext.setVisible(false);
                                    textfeld.setVisible(true);
                                    prufen.setVisible(true);
                                    eingabe.setVisible(true);
                                }

                                if (sekunden == 0) {
                                    minuten--;
                                    sekunden = 59;
                                    zeittext.setText(String.format("%02d:%02d min", minuten, sekunden));
                                } else {
                                    sekunden--;
                                    zeittext.setText(String.format("%02d:%02d min", minuten, sekunden));
                                }


                            }
                        });
                        timer.setRepeats(true);
                        timer.start();
                    }


                }
            }
        });
 
Beste Antwort
Du hast doch schon einige Hinweise bekommen. Hast Du mal danach gesucht? Oder wartest Du auf fertigen Code? Das ist eher unüblich und wir helfen mehr, den Weg zu finden um sich dann die Dinge selbst anzueignen. Bei allen neuen Dingen ist es wichtig, dass Du damit herum spielst und aktiv etwas machst. Nur so lernst Du! Das ist ein normales Vorgehen.

Der wichtige Schritt für dich wäre also ggf., einmal nach den Hinweisne zu suchen um sich das etwas mehr anzusehen. Und das kann man gerne einmal gemeinsam machen. So hatte ich mehrere Möglichkeiten genannt und die schauen wir uns einfach einmal an:

Preference api:
Und da finden sich dann viele Tutorials und Beispiele. (Das...
Da das Passswort plaintext in der Datei steht, gehe ich davon aus, dass es sich um einen theoretischen Ansatz handelt. Weiter gehe ich davon aus, dass es sich um eine Swing-Anwendung handelt.

Du Möglichkeiten das mit Java zu machen sind äußerst begrenzt, unter den gegebenen Umständen. Zum einen könnte man den Code dekompilieren und man würde das Passwort sehen und könnte es eintippen. Zum anderen könnte man mit einem Profiler den INhalt der Variablen auslesen.

Du könntest eine Datenbank (z.B. Datei oder Umgebungsvariable oder ähnliches) schreiben, dass einen Hinweis auf die Sperre hat. Zum Beispiel ein Datumsstempel, wann man sich wieder einloggen kann.

Du könntest unterbinden, dass man das Programm beendet. Man müsste es dann jedesmal via Prozess abschießen, das verlangsamt einen Angreifer auch.

Du könntest eine relationale DB verwenden und diese mit einem Passwort sichern. Sicherlich schwerer, jenachdem welche Rechte der User auf dem lokalen Rechner hat, aber nicht unmöglich zu umgehen.

Dein Problem wird sein, dass alles, was das Programm wissen muss, um die geheimen Informationen abzurufen, irgendwie im Zugriff sein müssen. Und somit auch der User auf seinem PC im zugriff hat.

Um das alles zu mitigieren, könnte man eine verschlüsselte Datei verwenden. Der User legt ein PW fest, das nirgens gespeichert ist. Zum entschlüsseln benötigt er das Passwort. In der Datei könnte man etwas ablegen, um zu prüfen, ob die Entschlüsselung korrekt gelaufen ist.


Bitte beschreibt genau eure Idee und zeigt mir dafür den ganzen neuen/bearbeiteten Code(auch was importiert wird)!

Ich habe dafür keine Zeit und Lust.
 
Da das Passswort plaintext in der Datei steht, gehe ich davon aus, dass es sich um einen theoretischen Ansatz handelt. Weiter gehe ich davon aus, dass es sich um eine Swing-Anwendung handelt.

Du Möglichkeiten das mit Java zu machen sind äußerst begrenzt, unter den gegebenen Umständen. Zum einen könnte man den Code dekompilieren und man würde das Passwort sehen und könnte es eintippen. Zum anderen könnte man mit einem Profiler den INhalt der Variablen auslesen.

Du könntest eine Datenbank (z.B. Datei oder Umgebungsvariable oder ähnliches) schreiben, dass einen Hinweis auf die Sperre hat. Zum Beispiel ein Datumsstempel, wann man sich wieder einloggen kann.

Du könntest unterbinden, dass man das Programm beendet. Man müsste es dann jedesmal via Prozess abschießen, das verlangsamt einen Angreifer auch.

Du könntest eine relationale DB verwenden und diese mit einem Passwort sichern. Sicherlich schwerer, jenachdem welche Rechte der User auf dem lokalen Rechner hat, aber nicht unmöglich zu umgehen.

Dein Problem wird sein, dass alles, was das Programm wissen muss, um die geheimen Informationen abzurufen, irgendwie im Zugriff sein müssen. Und somit auch der User auf seinem PC im zugriff hat.

Um das alles zu mitigieren, könnte man eine verschlüsselte Datei verwenden. Der User legt ein PW fest, das nirgens gespeichert ist. Zum entschlüsseln benötigt er das Passwort. In der Datei könnte man etwas ablegen, um zu prüfen, ob die Entschlüsselung korrekt gelaufen ist.




Ich habe dafür keine Zeit und Lust.
Danke für deine tollen Ideen!
 
Also das wirkliche Problem wurde schon genannt:
Dein Problem wird sein, dass alles, was das Programm wissen muss, um die geheimen Informationen abzurufen, irgendwie im Zugriff sein müssen. Und somit auch der User auf seinem PC im zugriff hat.

Das einzige, das wirklich machbar ist, das Sinn macht, wurde auch aufgezeigt:
Um das alles zu mitigieren, könnte man eine verschlüsselte Datei verwenden. Der User legt ein PW fest, das nirgens gespeichert ist. Zum entschlüsseln benötigt er das Passwort. In der Datei könnte man etwas ablegen, um zu prüfen, ob die Entschlüsselung korrekt gelaufen ist.
Aber das macht man dann nicht im Programm selbst. Du legst alles einfach auf ein verschlüsseltes Medium. Dann nutzt Du z.B. VeraCrypt, Bitlocker oder ähnliches um ein verschlüsseltes Medium zu haben. Da liegt dann alles, also auch das Programm selbst. Dann hast Du keinerlei Entwicklungsaufwand und kannst Dich auf weit verbreitete Methoden nutzen, die vermutlich relativ sicher sind.

Im Rahmen der Programmierung ist es bei so Anmeldungen üblich, dass Du eine zentrale Instanz hast, die dafür zuständig ist und der vertraut wird.

Die Frage ist also wirklich in erster Linie: Was genau willst Du erreichen? Was möchtest Du lernen?

Das generelle Problem, welches du beschreibst, ist einfach nur, dass Du Daten Persistent haben willst. Du musst also die Daten, die zwischen Starts genutzt werden, irgendwo sicher ablegen. Dies kann z.B. auf dem Dateisystem sein. Und da gibt es dann ganz viele Möglichkeiten und Du kannst es Dir frei aussuchen: Textdatei, Object Streams, XML oder JSON...

Das Java Framework bietet hier diverse Dinge an:
  • Textdatei kannst Du selbst schreiben und lesen.
  • Du kannst Properties lesen / schreiben.
  • Du kannst Objekte mit den ObjectStreams direkt lesen / schreiben.
  • Und zuletzt auch noch die Preferences API.


Wenn Du die Textdatei in lesbarer Form in den üblichen Formaten (JSON / XML) haben willst, dann wären externe Library sinnvoll wie Jackson, Gson oder ähnliches.

Das wäre aber dann nur sinnvoll für das erlernen diverser Techniken. Das führt zu keiner Lösung, die sonst irgendwie brauchbar oder interessant wäre.
 
Also das wirkliche Problem wurde schon genannt:


Das einzige, das wirklich machbar ist, das Sinn macht, wurde auch aufgezeigt:

Aber das macht man dann nicht im Programm selbst. Du legst alles einfach auf ein verschlüsseltes Medium. Dann nutzt Du z.B. VeraCrypt, Bitlocker oder ähnliches um ein verschlüsseltes Medium zu haben. Da liegt dann alles, also auch das Programm selbst. Dann hast Du keinerlei Entwicklungsaufwand und kannst Dich auf weit verbreitete Methoden nutzen, die vermutlich relativ sicher sind.

Im Rahmen der Programmierung ist es bei so Anmeldungen üblich, dass Du eine zentrale Instanz hast, die dafür zuständig ist und der vertraut wird.

Die Frage ist also wirklich in erster Linie: Was genau willst Du erreichen? Was möchtest Du lernen?

Das generelle Problem, welches du beschreibst, ist einfach nur, dass Du Daten Persistent haben willst. Du musst also die Daten, die zwischen Starts genutzt werden, irgendwo sicher ablegen. Dies kann z.B. auf dem Dateisystem sein. Und da gibt es dann ganz viele Möglichkeiten und Du kannst es Dir frei aussuchen: Textdatei, Object Streams, XML oder JSON...

Das Java Framework bietet hier diverse Dinge an:
  • Textdatei kannst Du selbst schreiben und lesen.
  • Du kannst Properties lesen / schreiben.
  • Du kannst Objekte mit den ObjectStreams direkt lesen / schreiben.
  • Und zuletzt auch noch die Preferences API.


Wenn Du die Textdatei in lesbarer Form in den üblichen Formaten (JSON / XML) haben willst, dann wären externe Library sinnvoll wie Jackson, Gson oder ähnliches.

Das wäre aber dann nur sinnvoll für das erlernen diverser Techniken. Das führt zu keiner Lösung, die sonst irgendwie brauchbar oder interessant wäre.
Danke für deine Antwort. Das das Passwort irgendwo gespeichert werden muss, ist nartürlich klar. Am besten wäre es, wenn die Datei einfach irgendwo im Explorer gespeichert, nartürlich kann dann jeder darauf zu greifen. Aber das ist erst mal egal.
 
Der Explorer ist ja nur ein Stück Software, du meinst vermutlich das Dateisystem.

https://www.baeldung.com/java-write-to-file

Da kannst du z. B. auch eine Zeit speichern, um dein Ursprungsproblem zu lösen. Allerdings taugt das alles nicht viel und ist leicht zu umgehen. Dazu wurde ja bereits einiges geschrieben.
Das Programm muss sowieso nicht bombensicher sein. Es ist mir tatsächlich egal wie sicher es ist, solange das Passwort nicht auf der graphischen Oberfläche angezeigt wird und mein eigentliches Problem behoben wurde(Kann man das irgendwie ändern, das immer wenn das Programm gestartet wird, geprüft wird, wie viele Versuche noch vom letzten mal übrig waren und man dann auch nur die Versuche wieder hat, bzw. das dann der Countdown weiterläuft, wo er davor unterbrochen worde.) In dem Programm sind sowieso keine geheimen Informationen oder so gespeichert, das Programm ist ein ganz normales Programm. Aber trotzdem danke für deine Antwort.
 
Du hast doch schon einige Hinweise bekommen. Hast Du mal danach gesucht? Oder wartest Du auf fertigen Code? Das ist eher unüblich und wir helfen mehr, den Weg zu finden um sich dann die Dinge selbst anzueignen. Bei allen neuen Dingen ist es wichtig, dass Du damit herum spielst und aktiv etwas machst. Nur so lernst Du! Das ist ein normales Vorgehen.

Der wichtige Schritt für dich wäre also ggf., einmal nach den Hinweisne zu suchen um sich das etwas mehr anzusehen. Und das kann man gerne einmal gemeinsam machen. So hatte ich mehrere Möglichkeiten genannt und die schauen wir uns einfach einmal an:

Preference api:
Und da finden sich dann viele Tutorials und Beispiele. (Das kann man übrigens der Suche auch hinzufügen!)

Java Object Stream:
Und da wäre einer der Treffer: Object Streams (The Java™ Tutorials > Essential Java Classes > Basic I/O) (oracle.com)

Java Properties:
Mit Treffern wie: Getting Started with Java Properties | Baeldung

Dann mit zusätzlichen Libraries - da war z.B. Gson genannt worden:
Da gibt es dann ganz viele Treffer. Ggf. reichen die noch nicht aus, da Du da halt eine Library hinzufügen musst. Aber Treffer gibt es viele - so ein Link zu dem gson Projet / homepage aber diesmal auch etwas auf Deutsch:
Zwei Möglichkeiten, Gson für JSON in Java zu verwenden (twilio.com)


Und der Code ist dann relativ einfach. nehmen wir doch einfach einmal die Preference API mit dem ersten Treffer bei mir:
Java Preferences API - Tutorial (vogella.com)
In dem Code hast Du mehrere wichtige Dinge:
a) Variable zur Nutzung: private Preferences prefs;
b) Initialisierung: prefs = Preferences.userRoot().node(this.getClass().getName());
c) Wert laden: prefs.getInt(ID3, 50) (Ich habe hier das Laden eines int Wertes genommen. Du willst ja die Anzahl der Versuche speichern.)
d) Wert speichern: prefs.putInt(ID3, 45);

Zu beachten: ID3 ist eine String Variable. Und auch wenn da im Tutorial falsch gemacht wurde: Variablen bitte immer klein schreiben! Und wenn etwas eine Konstante ist (wie da wohl beabsichtigt) dann bitte auf Klassenebene eine Konstante nutzen: public static final String ID3 = "....";. Da evtl. etwas mehr drauf achten.
 
Beste Antwort
Du hast doch schon einige Hinweise bekommen. Hast Du mal danach gesucht? Oder wartest Du auf fertigen Code? Das ist eher unüblich und wir helfen mehr, den Weg zu finden um sich dann die Dinge selbst anzueignen. Bei allen neuen Dingen ist es wichtig, dass Du damit herum spielst und aktiv etwas machst. Nur so lernst Du! Das ist ein normales Vorgehen.

Der wichtige Schritt für dich wäre also ggf., einmal nach den Hinweisne zu suchen um sich das etwas mehr anzusehen. Und das kann man gerne einmal gemeinsam machen. So hatte ich mehrere Möglichkeiten genannt und die schauen wir uns einfach einmal an:

Preference api:
Und da finden sich dann viele Tutorials und Beispiele. (Das kann man übrigens der Suche auch hinzufügen!)

Java Object Stream:
Und da wäre einer der Treffer: Object Streams (The Java™ Tutorials > Essential Java Classes > Basic I/O) (oracle.com)

Java Properties:
Mit Treffern wie: Getting Started with Java Properties | Baeldung

Dann mit zusätzlichen Libraries - da war z.B. Gson genannt worden:
Da gibt es dann ganz viele Treffer. Ggf. reichen die noch nicht aus, da Du da halt eine Library hinzufügen musst. Aber Treffer gibt es viele - so ein Link zu dem gson Projet / homepage aber diesmal auch etwas auf Deutsch:
Zwei Möglichkeiten, Gson für JSON in Java zu verwenden (twilio.com)


Und der Code ist dann relativ einfach. nehmen wir doch einfach einmal die Preference API mit dem ersten Treffer bei mir:
Java Preferences API - Tutorial (vogella.com)
In dem Code hast Du mehrere wichtige Dinge:
a) Variable zur Nutzung: private Preferences prefs;
b) Initialisierung: prefs = Preferences.userRoot().node(this.getClass().getName());
c) Wert laden: prefs.getInt(ID3, 50) (Ich habe hier das Laden eines int Wertes genommen. Du willst ja die Anzahl der Versuche speichern.)
d) Wert speichern: prefs.putInt(ID3, 45);

Zu beachten: ID3 ist eine String Variable. Und auch wenn da im Tutorial falsch gemacht wurde: Variablen bitte immer klein schreiben! Und wenn etwas eine Konstante ist (wie da wohl beabsichtigt) dann bitte auf Klassenebene eine Konstante nutzen: public static final String ID3 = "....";. Da evtl. etwas mehr drauf achten.
DAnke für deine Antwort, sie hat mir sehr weiter geholfen. Ich konnte mein Problem lösen!
 

Zurück
Oben