Passwort speichern

TobyNick

Grünschnabel
Hallo,

ich habe eine Frage. Ich habe ein Programm geschrieben und um das Programm starten zu können, soll ein Passwort abgefragt werden. Da ich weiß, dass eine wirklich sichere Passwort-Abfrage komplizierter ist, als man denkt, sag ich schon mal, dass das nur ein Programm für Freunde ist und einfach nur unerwünschte Personen, an deren PC's nicht das Programm (ausversehen) öffnen. Also es sind keine Profi-Hacker, deswegen muss man es auch nicht soooo sicher machen. ;-)
Ich habe also programmiert, dass wenn jemand zum ersten Mal das Programm startet, derjenige das Passwort, das er haben will eingibt (konfiguriert), es verschlüsselt wird und abgespeichert wird und ab dann das Passwort immer abgefragt wird.

Meine Frage ist, wie man das (verschlüsselte) Passwort einigermaßen sicher abspeichern kann, um es wieder abfragen zu können. Es soll nicht so kompliziert sein mit Datenbank und so. Ich habe an irgendeine Datei gedacht, in die ich das reinschreibe. Das würde generell auch reichen für meine Zwecke, aber die sollte dann nicht irgendwo sichtbar sein, dass man sie z.b. einfach schnell löschen könnte.
Wenn ich das Programm als .jar-Datei habe (und es somit ausführbar ist), dann habe ich gedacht, dass ich die Datei in die .jar-Datei packe. Dann ist sie wenigstens nicht so sichtbar. Aber dann wird das glaube ich ziemlich schwierig mit dem Schreiben in die Datei oder?
Oder kann ich machen, dass wenn ich die Datei, in der das Passwort steht, einfach neben der .jar-Datei habe, auf die Datei nicht zugegriffen werden kann und somit das Passwort nicht gelöscht werden kann.

Ich hoffe ihr versteht, was ich meine. ;-)
Ansonsten einfach nachfragen, dann versuche ich es noch besser zu erklären. :)

Danke!
 
Der Trick ist ganz einfach (und ist Standard-Vorgehen). Du musst das Passwort nicht verschlüsseln (denn dann könnte man es ja entschlüsseln), sondern du speicherst den Hashcode des Passwortes. Diesen kann ruhig jeder lesen (wenn er die z.B. die Datei öffnet, welche das PW enthält), denn er kann damit nichts anfangen. Bei der Passwort Überprüfung prüfst du dann wiederum den Hashcode der Eingabe gegen den gespeicherten Hash.

Hier zum weiter lesen: http://en.wikipedia.org/wiki/Hash_function
Und hier ein Verfahren, welchen du benutzen kannst. Das sollte nicht mehr Aufwand sein, als ein Methodenaufruf: http://en.wikipedia.org/wiki/SHA-1

Das ist auch der Grund, wieso dir keine Webseite dein Passwort per Mail senden kann, denn sie kennen es einfach nicht und müssen beim Vergessen ein neues generieren.
 
Also egal wo du die Datei speicherst und ob du sie nun als einfache Textdatei oder sonst wie speicherst.
Ich denke mal der Schwachpunkt an dem System ist das wenn die Datei nicht vorhanden ist einfach ein Passwort verlangt und die Datei (neu) angelegt wird.

Mach es doch so das das Programm mit dieser Datei "ausgeliefert" wird und ein Standardpasswort eingetragen ist, z.B. "geheim"
Das Passwort "geheim" ist dann auch im Programm selber hinterlegt und beim Start wird geprüft ob es noch so in der Datei steht.

JA: Es kommt eine Meldung das das Passwort geändert werden muss.
NEIN: Der User hat sein Passwort bereits geändert und die Prüfung wird vorgenommen.

Wenn jetzt jemand die Datei gelöscht hat musst du halt das entsprechend bei der Anmeldung abfangen.
 
Der Trick ist ganz einfach (und ist Standard-Vorgehen). Du musst das Passwort nicht verschlüsseln (denn dann könnte man es ja entschlüsseln), sondern du speicherst den Hashcode des Passwortes. Diesen kann ruhig jeder lesen (wenn er die z.B. die Datei öffnet, welche das PW enthält), denn er kann damit nichts anfangen. Bei der Passwort Überprüfung prüfst du dann wiederum den Hashcode der Eingabe gegen den gespeicherten Hash.

Hier zum weiter lesen: http://en.wikipedia.org/wiki/Hash_function
Und hier ein Verfahren, welchen du benutzen kannst. Das sollte nicht mehr Aufwand sein, als ein Methodenaufruf: http://en.wikipedia.org/wiki/SHA-1

Das ist auch der Grund, wieso dir keine Webseite dein Passwort per Mail senden kann, denn sie kennen es einfach nicht und müssen beim Vergessen ein neues generieren.

Ist es nicht egal, ob ich den Hashcode nehme oder das Passwort selbst mit nem eigenen Algorithmus verschlüssel? Mir ist klar, dass mein Algo 1000000% unsicherer ist. Aber sicher genug für die Zwecke, die ich brauche ;-)

@tombe: also, meinst du ich soll, falls die Datei gelöscht wird, einfach die Datei wieder bei Programmstart erstellen und ins Programm ein Standard-Passwort einbauen, damit man nicht einfach die Datei löschen kann und dann trotzdem ins Programm reinkommt, sondern, dass falls die Datei gelöscht ist, wieder zuerst das Standard-Passwort eingegeben werden muss?
Danke! Hat mir auf jeden Fall geholfen. ;-)
 
Ist es nicht egal, ob ich den Hashcode nehme oder das Passwort selbst mit nem eigenen Algorithmus verschlüssel? Mir ist klar, dass mein Algo 1000000% unsicherer ist. Aber sicher genug für die Zwecke, die ich brauche
Nein, ist es nicht, denn:
Dein Algorythmus kann (eventuell) wieder entschlüsselt werden, und der Hashcode nicht. ;)

[EDIT]: Wenn du mehr Sicherheit brauchst, kannst du mit dem CMD-Befehl CACLS den Zugriff auf die Datei verweigern lassen und nur für den Lesevorgang bei der Passwortabfrage kurz entsperren. Dann kann niemand (der cacls nicht kennt) die Datei lesen, ändern oder löschen. ;)
 
Zuletzt bearbeitet:
Also ich würde es so machen das wenn die Datei fehlt, das dann das Programm gar nicht mehr gestartet wird. Wenn sonst jemand das Standardpasswort kennt, kann er in diesem Fall trotzdem starten und das soll ja verhindert werden.

Wenn die Datei neu erstellt wird, dann kann ich hergehen die Datei einfach in einen anderen Ordner verschieben und dann das Programm starten (entweder mit dem Standardpasswort oder wenn es möglich ist geben ich ein komplett neues ein und erstelle die Datei neu).

Wenn ich fertig bin, lösche ich "meine" Passwortdatei und schiebe die ursprüngliche Datei wieder an den alten Platz. Dann würde keiner was davon merken!

So wie ich es meinte, soll das Programm gar nicht mehr gestartet werden wenn die Datei fehlt.
Im Programm soll z.B. das Passwort "geheim" hart einprogrammiert sein. Beim Starten wird dann geprüft ob

1) Die Passwortdatei vorhanden ist. Wenn nicht wird eine Meldung ausgegeben und das Programm beendet.
2) Wenn die Datei vorhanden ist, wird geprüft ob das in der Datei vorhandene Passwort noch "geheim" ist. In diesem Fall muss es geändert werden. Anschließend wird das Programm gestartet.
3) Wenn die Datei vorhanden ist und das Passwort ist nicht "geheim" wird geprüft ob die Eingabe und das in der Datei gespeicherte Passwort übereinstimmen.
 
Zuletzt bearbeitet:
Bei diesen Methoden der Passwortspeicherung gibt es allerdings ein Problem. Ein "Hacker" nimmt einfach ein eigenes Passwort, erzeugt den Hash-Code und schreibt es in die Datei.
Dann hat er mit seinem Passwort die Zugriffsrechte.

Daher wäre es doch sinnvoller, einen eigenen Einwegalgorythmus (!) zu nehmen.
Siehe: http://de.wikipedia.org/wiki/Einwegfunktion
 
@jellysheep: ich sag ja, dass das nicht so sicher sein muss. das wird schon nicht wieder entschlüsselt. ;-)

@tombe: hmm, aber dann kann man das programm ja gar nicht mehr starten, wenn die datei weg ist. das ist ja auch blöd. ich habe es jetzt so gemacht, wie ich es von dir verstanden hatte. ich denke, das reicht für meine zwecke. du hast mir also gut geholfen. danke! :)
 
Wenn die Datei weg ist, dann muss derjenige sich nur von dir einfach wieder eine Datei mit dem Standardpasswort geben lassen und sein Passwort wieder eingeben.

Er merkt dann aber auch das etwas versucht wurde!
 
Man kann es noch sicherer gestalten. :D
Man gibt den Quellcode des Programmes weiter, und zusätzlich ein Programm, welches:
  • als erstes gestartet wird
  • ein Passwort verlangt
  • die Hash-Summe o.ä. des Passwortes in den Quellcode reinschreibt
  • den Quellcode comiliert
  • und evtl. sich selbst löscht.
Dann hat man keine extra Passwort-Dateien, denn das Passwort ist im Code verankert und kann so gut wie gar nicht geändert werden. ;)
Allerdings wird dann auch ein JDK benötigt, um das Programm zu compilen. :(
 
Zurück