# Passwort in Datei speichern - wie?



## DStrohma (3. Aug 2012)

Hallo,

ich schreibe an einer Anwendung bei der der Benutzer die Möglichkeit haben soll ein Passwort zu hinterlegen, das dann gespeichert wird und beim nächsten Start zur Verfügung steht.
Meine Frage wäre: Wie schaffe ich es dass es nicht im Klartext hinterlegt wird?? Zwei Dinge gingen mir bereits durch den Kopf:

1) Das Passwort in eine Klasse packen und diese Klasse dann serialisieren und beim nächsten Start wieder de-serialisieren.
2) Mit Hilfe irgend eines Algos den Klartext verändern und speichern und beim nächsten Start mit Hilfe des Algos wieder herstellen. Was eignet sich dafür am besten??

Danke im Voraus!


----------



## maki (3. Aug 2012)

> Was eignet sich dafür am besten??


"Besser" ist die Steigerung von "Gut", aber gut ist keine der Optionen...

Was du willst geht nicht wirklich "sicher", das beste/praktischte wäre dann gar nicht erst zu versuchen zu verschlüsseln, sondern einfach nur kodieren, wie zB. mit Base64, das lässt sich dann sogar mit Winzip "knacken", ist aber nicht unsicherer als deine Alternativen, nur einfacher umzusetzen


----------



## turtle (3. Aug 2012)

Passwörter werden selten so abgespeichert, dass diese wieder zu Klartext gemacht werden können.

Wie maki richtig anmerkte, wird stattdessen ein Hashwert berechnet (z.B. SHA-1, MD5, oder...) und dies wird mit der Userangabe verglichen, nachdem daraus auch wieder ein Hashwert errechnet wurde. Somit steht das Passwort nirgends im Klartext und es kann überprüft werden ob Hash(Userangabe) mit dem gespeicherten Wert übereinstimmt. 

Damit nicht gleiche Passwörter immer wieder zu gleichen Hashwerten führen kann man da noch sogenannten Salt hinzugeben um eine Attacke zu erschweren.


----------



## DStrohma (3. Aug 2012)

Also gut, dann gibt es also tatsächlich nicht wirklich etwas sicheres  Das ist soweit ok, nicht weiter schlimm. Ich würde das Passwort gerne in einer lokalen Properties Datei speichern. Aber wie gesagt, nicht umbedingt im Klartext.
Irgend eine Idee wie das am besten zu bewerkstelligen ist? Auch mit Base64?? Oder ist das eher nur für die Ausgabe in einer eigenen Datei?


----------



## DStrohma (3. Aug 2012)

turtle hat gesagt.:


> Passwörter werden selten so abgespeichert, dass diese wieder zu Klartext gemacht werden können.
> 
> Wie maki richtig anmerkte, wird stattdessen ein Hashwert berechnet (z.B. SHA-1, MD5, oder...) und dies wird mit der Userangabe verglichen, nachdem daraus auch wieder ein Hashwert errechnet wurde. Somit steht das Passwort nirgends im Klartext und es kann überprüft werden ob Hash(Userangabe) mit dem gespeicherten Wert übereinstimmt.
> 
> Damit nicht gleiche Passwörter immer wieder zu gleichen Hashwerten führen kann man da noch sogenannten Salt hinzugeben um eine Attacke zu erschweren.



Ja das habe ich soweit auch implementiert gehabt aber da gibt es einfach das Problem dass der User ständig das Passwort eingeben muss. Ich kann es bei dieser Vorgehensweise nicht speichern, sondern muss es immer wieder abfragen. Ich würde es aber gerne speichern. Mir ist vollkommen klar dass das nicht sicher ist, das muss es aber für meinen Anwendungsfall ehrlich gesagt auch nicht sein.


----------



## L-ectron-X (3. Aug 2012)

Folgende Klasse gibt dir den aus einer übergebenen Zeichenkette erzeugten MD5-Hash zurück:

```
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;


public class MD5Hash {

   public static String getMD5Hash(String str) {
      StringBuilder sb = new StringBuilder(32);
      try {
         MessageDigest md5 = MessageDigest.getInstance("MD5");
         md5.update(str.getBytes());
         Formatter f = new Formatter(sb);
         for (byte b : md5.digest()) {
            f.format("%02x", b);
         }
      } 
      catch (NoSuchAlgorithmException ex) {
         ex.printStackTrace();
      }
      return sb.toString();
   }
}
```


----------



## DStrohma (3. Aug 2012)

L-ectron-X hat gesagt.:


> Folgende Klasse gibt dir den aus einer übergebenen Zeichenkette erzeugten MD5-Hash zurück:
> [...]



Danke! Aber wie gesagt, ich hatte das bereits gemacht (mit SHA-1) aber das hat sich einfach als unpraktisch erwiesen. Ich möchte das Passwort wirklich speichern.


----------



## L-ectron-X (3. Aug 2012)

Kannst du doch. Schreibe doch das Ergebnis der Hashberechnung in eine (Text-)datei. Zum Vergleichen der Benutzereingabe liest du das Passwort wieder aus der Textdatei aus...
Oder verstehe ich dich falsch?


----------



## DStrohma (3. Aug 2012)

L-ectron-X hat gesagt.:


> Kannst du doch. Schreibe doch das Ergebnis der Hashberechnung in eine Textdatei. Zum Vergleichen der Benutzereingabe liest du das Passwort wieder aus der Textdatei aus...
> Oder verstehe ich dich falsch?



Ich denke du verstehst mich falsch. Ich will nicht dass der Benutzer das Passwort beim Start der Anwendung nochmals angeben muss. Einmal angeben, speichern und dann immer wieder laden. Aber im Klartext speichern ist wirklich etwas zu billig. Ich würde es gerne etwas transformieren wollen, weis aber nicht was dafür das beste ist.
Das das nicht sicher ist weis ich.


----------



## L-ectron-X (3. Aug 2012)

Welchen Sinn hat denn ein Passwort, das quasi automatisch eingegeben wird?


----------



## zzuegg (3. Aug 2012)

Nja, wenn du das passwort speicher willst, ist das speichern des MD5 oder SHA1 eigentlich kein problem. Für jegliche authentifizierung sollte sowieso nur der hash übertragen/verglichen/gespeichert werden und nicht das klartext password. Insofern solltest du eignetlich kein problem haben... 

Eingabe direkt in hash umwandeln und anschliesend nur noch den hash benützen...


----------



## Tomate_Salat (3. Aug 2012)

DStrohma hat gesagt.:


> Aber im Klartext speichern ist wirklich etwas zu billig.



Wenn dein Programm das Passwort wiederherstellen kann, dann hält sich der Schutz wirklich stark in Grenzen. Es reicht wenn einer dein Programm dekompiliert. Der schaut sich dann die Routine zur Wiederherstellung an, schreibt ein kleines Tool und stellt es ins Internet ;-).

Wenn du etwas wie einen Passwortmanager schreiben willst, dann sollte dieser mindestens ein Master-Passwort haben, welches zum verschlüsseln der Passwörter beiträgt.


----------



## mla.rue (3. Aug 2012)

Mir erschließt sich irgendwie nicht so ganz der Sinn. Ich vermute der TO möchte so eine Art "passwort manager" wie ihn z.B. Firefox oder Thunderbird nutzt... 1x Passwort eingeben "abspeichern" Hacken an und es wird ab da automatisch benutzt.

Wie schon dutzendmal gesagt, du nimmst das Passwort (egal ob als kodierter Hashwert oder Klartext) und speicherst es in ein properties File, dieses File verschlüsselst du (egal wie, gibts genug Möglichkeiten) so, dass nur dein Javaprogramm drauf zugreifen kann (weil das Java Programm z.B. das Master-Passwort hat), es entschlüsseslt jedesmal die Datei, liest das PW aus und haut es automatisch rein, so dass der Anwender nichts machen muss.

Das Ganze ist aber sowas von unsicher, dass dir den ganzen Aufstand bezüglich Passwörter gleich sparen kannst.

Allerdings habe ich eine Anwendung, wo genau sowas passiert (wobei ich mir aber das Verschlüsseln der Datei spare). Die Anwender haen einfach 0 Ahnung und würden die Passwortdatei nie im Leben finden, sie würden neteinmal danach suchen. Leute mit genug krimineller Energie gibts in dem Tätigkeitsbereich auch nicht. Es gibt einfach ein, zwei Methoden, die nur eingeschränkt benutzt werden sollen, was sich über ein PW am einfachsten realisieren lies. Der Punkt ist aber, wenn ich das PW automatisch eintrage, können die User diese Methoden beim Starten bereits ausführen, was nicht sein soll. So blöd wie die sind, zeigt ihnen eine PW Abfrage "ok ups also jetzt vorsicht, sonst verhaue ich was".


----------



## DStrohma (3. Aug 2012)

Um mal den Sinn etwas zu erklären: Ich schreibe ein Programm das Backups von voreingestellten Ordnern erstellt (als ZIP) das ganze dann verschlüsselt und zu Dropbox hochlädt. Das Passwort brauche ich zum verschlüsseln der Datei.
Mir geht es nur darum dass Dropbox die Backups nicht einsehen kann. Mir geht es nicht darum das Programm vor anderen Usern sicher zu machen. Ich könnte das Passwort also eigentlich auch im Klartext speichern da ich nicht annehme dass sich ein Dropbox-Mitarbeiter bei mir einhäckt, mir das Passwort klaut und wahnsinnig interessiert meine Backups durchforstet... 

Und ja, die Verschlüsselung habe ich soweit schon und die ist sicher:

```
final Cipher encryptionCipher = Cipher.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
```
Mit Salt und dem ganzen drum und dran...


----------



## DStrohma (3. Aug 2012)

Ich muss auch mal sagen dass es mich echt fasziniert und amüsiert dass die meisten Leute gleich schreiben dass ich das mit Hashes machen muss sonst ist das nicht sicher usw. Habt doch einfach mal etwas Vertrauen in die Menschheit. Wenn das jemand so machen will, dann wird er schon seine Gründe haben.


----------



## Tomate_Salat (3. Aug 2012)

DStrohma hat gesagt.:


> Habt doch einfach mal etwas Vertrauen in die Menschheit



Stimme ich dir voll und ganz zu. Wenn du mir deine Kontodaten per PM schickst, werde ich sicher auf diese Aufpassen und dir helfen, dass du diese nicht verlierst/vergisst. =)

Nein ernsthaft: Jeder Benutzer deines Programms ist potentiell böse D). Wenn man der Menschheit vertrauen könnte, gäbe es nicht immer wieder so einen Wirbel um Sicherheit ;-). Ob du mal das Ziel von Hackern wirst, kann man vllt ausschließen. Aber das ist imho kein Grund, etwas schlecht zu lösen. Es reicht, wenn dir jemand aus deinem Bekanntenkreis schaden will ;-)


----------



## Sonecc (3. Aug 2012)

Warum wird hier dauernd von MD5 gesprochen??
MD5 ist kein brauchbarer Algorithmus um ein Passwort zu verschlüsseln...

Hier mal etwas Lektüre:

- Hash mich, die zweite | heise Security
- MD5 - Wikipedia, the free encyclopedia

Bitte, bitte, bitte, nicht mehr MD5 für sowas nutzen oder gar jemand anderem vorschlagen...


----------



## zzuegg (3. Aug 2012)

Sonecc hat gesagt.:


> Warum wird hier dauernd von MD5 gesprochen??
> MD5 ist kein brauchbarer Algorithmus um ein Passwort zu verschlüsseln...
> 
> Hier mal etwas Lektüre:
> ...



Naja, das kommt dann schon auf den Level der benötigten sicherheit an, wenn jemand einen so massiven Aufwand betreibt (Cluster aus 200ps3's) um an mein Password zu kommen dann bitte. 

Btw, warum ist SHA dann sicherer? Schneier on Security: Cryptanalysis of SHA-1

100% Sicherheit gibs nicht und wirds nie geben, alles nur eine Frage des aufwandes jeglichen Hash zu brechen. 

BTT:
Wenn das speicher von einem Klartext PW für dich dein problem ist, wo liegt dann das Problem?


----------



## Sonecc (3. Aug 2012)

zzuegg hat gesagt.:


> Naja, das kommt dann schon auf den Level der benötigten sicherheit an, wenn jemand einen so massiven Aufwand betreibt (Cluster aus 200ps3's) um an mein Password zu kommen dann bitte.



Bitte auch alles lesen, wenn du dir eine Meinung bilden willst.

Um mal aus dem von mir verlinkten Wikipedia Artikel zu zitieren:



> A collision attack exists that can find collisions within seconds on a computer with a 2.6 GHz Pentium 4 processo



Inzwischen ist MD5 so sicher, dass du es auch direkt im Klartext speichern kannst.
Desweiteren ist der erste teil deines Satzes schon mit ein Grund dafür, warum inzwischen fast jeden Tag neue Passwörter im Netz auftauchen (die dann auch noch oft schlecht oder gar nicht verschlüsselt sind). Es ist ein geringer Aufwand einen Algorithmus zu verwenden, der halbwegs sicher ist. Dafür habe ich die Daten aber dann wenigstens versucht zu schützen.


----------



## DStrohma (3. Aug 2012)

zzuegg hat gesagt.:


> BTT:
> Wenn das speicher von einem Klartext PW für dich dein problem ist, wo liegt dann das Problem?



Ja ich könnte es im Klartext speichern aber bevorzuge zumindest soviel Sicherheit, dass jemand der die Datei öffnet in der es gespeichert ist, nicht gleich das direkte Passwort sieht. Ich wäre froh wenn mir jemand vielleicht einen Algo vorschlagen könnte der den String etwas "verwüstet" und das dann im Code auch wieder rückgängig machen kann. Das ist alles was ich brauch.


----------



## L-ectron-X (3. Aug 2012)

DStrohma hat gesagt.:


> Ich wäre froh wenn mir jemand vielleicht einen Algo vorschlagen könnte der den String etwas "verwüstet" und das dann im Code auch wieder rückgängig machen kann


Der Einfachste dürfte IMHO ROT13 sein.


----------



## iB0T (3. Aug 2012)

Hallo, möchte exakt das gleiche wie DStrohma.
Jedoch möchte ich den Quellcode verstehen!Kann mir wer ein gutes Tutorial zu diesem Thema empfehlen?


----------



## Sonecc (3. Aug 2012)

Hashing Java - OWASP

Wobei hier SHA1 verwendet wird. Gibt deutlich bessere Algorithmen


----------



## iB0T (3. Aug 2012)

Danke, hättest du auch noch was in Videoform (das ist einfacher)


----------



## bone2 (3. Aug 2012)

Reicht dir Base64 dafür nich?


----------



## g4rt (3. Aug 2012)

iB0T hat gesagt.:


> Danke, hättest du auch noch was in Videoform (das ist einfacher)



Wie kopierst du Quellcode aus einem Video?


----------



## Sonecc (3. Aug 2012)

iB0T hat gesagt.:


> Danke, hättest du auch noch was in Videoform (das ist einfacher)



Nein hab ich nicht. Kleiner Tipp: Heutzutage kann man sowas googlen!


----------



## iB0T (3. Aug 2012)

OOOOOPS ich habe (ohne Witz) google vergessen.Und nein bei Videos versteh ich das einfach nur leichter


----------



## turtle (3. Aug 2012)

> ...das Problem dass der User ständig das Passwort eingeben muss.



Das verstehe ich nicht :bahnhof:

Warum muss der Benutzer das Passwort mehrmals eingeben? Wenn ich beispielsweise an eine Datenbank denke, so authentifiziert sich der Benutzer ja auch nur einmal. Die Verbindung zur DB wird aufgebaut und erst bei Programmende geschlossen.


----------



## DStrohma (3. Aug 2012)

Hey iBOT, ist nehme an dass es nicht Absicht ist dass in deiner Signatur ausgerechnet das Wort "intelligentes" falsch geschrieben ist


----------



## DStrohma (3. Aug 2012)

turtle hat gesagt.:


> Das verstehe ich nicht :bahnhof:
> 
> Warum muss der Benutzer das Passwort mehrmals eingeben? Wenn ich beispielsweise an eine Datenbank denke, so authentifiziert sich der Benutzer ja auch nur einmal. Die Verbindung zur DB wird aufgebaut und erst bei Programmende geschlossen.



Ich meinte damit, dass der User bei jedem Start der Anwendung sein Passwort eingeben muss (daraus wird dann der Hash errechnet und mit dem gespeicherten Hash verglichen). Das will ich aber nicht. Ich will dass der User einmal ein Passwort angibt und es ab diesem Zeitpunkt nicht mehr angeben muss - es also gespeichert wird. Womit soll ich denn den gespeicherten Hash vergleichen wenn der User sein Passwort nicht jedes mal beim Start neu eingibt?


----------



## DStrohma (3. Aug 2012)

L-ectron-X hat gesagt.:


> Der Einfachste dürfte IMHO ROT13 sein.



Yep, ich denke das nehme ich


----------

