# In Java String sicher verschlüsseln



## Tollpatsch (29. Okt 2013)

Servus Leute,

ich studiere Wirtschaftsinformatik im 3ten Semester, habe würde ich sagen fortgeschrittene Kenntnisse in der Java Programmierung, Grundkenntnisse der Datenbankprogrammierung/einbindung, Grundkenntnisse in der GUI programmierung...

So worum geht es hier?
Ich möchte ein Programm erstellen das dem User ermöglich seine Passwörter von Amazon, PayPal etc sicher zu hinterlegen!



Wie habe ich es vor zu bewerkstelligen?
Es gibt mehrere Benutzerkonten
1. User 1 registriert sich und hinterlegt seine Passwörter für z.B. Amazon
2. Jedes der Passwörter soll in der Datenbank hinterlegt werden
2.1 Bei dem Loginpasswort hab ich mir überlegt das Passwort zu Hashen und dieses dann zu hinterlegen und dann beim Login zu überprüfen ob das dort eingegebene Passwort gehasht, den Wert ergibt den das Passwort in der db hat.
Aber
Nun gibt es 2, für mich ersichtliche Probleme
1. Welchen Verschlüsselungsalgorithmus wende ich an, dieser soll jetzt keine 5minuten brauchen, um den verschlüsselten Wert zu erstellen. Welches Zeitintervall muss ich mindestens einplanen?
2. Bei der Anzeige des jeweiligen Passwortes wird ja das Passwort in eine Variable gespeichert und dann ausgeben über ein Popup oder ähnliches! Wie entferne ich das Passwort wiede raus dem Zentralspeicher? dort ist es ja hinterlegt? Reicht eine einfache Überschreibung des Passwortes also 

```
String p ="Passwort";
System.out.print(p);
p="XXXXXXXXXXXXXXX";
```

gegoogelt habe ich schon habe nach Java Verschlüsselung gegoogelt dort aber entweder nur sehr einfache Verschlüsselungsvarianten gefunden oder hoch komplexe die ich nicht verstanden habe!
Deshalb wäre es super wenn heir jemand einen Link schickt eben in diesem Link auch erklärt wird wie der Code zustandekommt!

Was denkt ihr darüber? Hab ich alle Risiken/Probleme bedacht was so ein Passwortmanager mti sich führt?


----------



## Max_ (30. Okt 2013)

Tollpatsch hat gesagt.:


> ```
> String p ="Passwort";
> System.out.print(p);
> p="XXXXXXXXXXXXXXX";
> ```



Ich habe relativ wenig Ahnung von Java ansich und auch bei Passwörter kann ich dir nicht helfen, aber wenn es nur um eine simple Anwendung geht, würde ich dir empfehlen md5 und sha mal näher anzuschauen. (Wichtig ist das du einen statischen und noch einen dynamischen Salt hinzufügst),


[Java]String p =hash("Passwort")[/Java]
Damit kannst du das Passwort nicht mehr ausgeben, es wird aber auch in keiner Variable gespeichert. Ob es bezogen auf die Sicherheit etwas bringt kann ich dir nicht sagen. Warte lieber auf jemanden der mehr Ahnung hat als ich.


----------



## BildschirmUser (30. Okt 2013)

Also wenn ich das richtig verstanden habe, möchtest du eine Art Passwortspeicher anlegen, dessen Inhalt sich erst nach Eingabe eines Passworts offenbart, oder?

Also den Inhalt selbst würde ich mit RSA oder so verschlüsseln (oder auch AES).

Der User soll dann zum sichtbar machen des Inhalts den zum Verschlüsseln genutzten Key eingeben...


----------



## calousy (30. Okt 2013)

Max_ hat gesagt.:


> Ich habe relativ wenig Ahnung von Java ansich und auch bei Passwörter kann ich dir nicht helfen, aber wenn es nur um eine simple Anwendung geht, würde ich dir empfehlen md5 und sha mal näher anzuschauen. (Wichtig ist das du einen statischen und noch einen dynamischen Salt hinzufügst),


was soll ein statischer und dynamischer Salt bringen? Ein dynamischer reicht aus. Wenn du einen statischen verwendest, kannst du dir auch eine Rainbow-Table damit basteln. Bei einem dynamischen Salt müsstest du dir für jeden möglichen Salt die Hashes für mögliche Passwörter berechnen. Der Aufwand ist also extrem größer.


> [Java]String p =hash("Passwort")[/Java]
> Damit kannst du das Passwort nicht mehr ausgeben, es wird aber auch in keiner Variable gespeichert. Ob es bezogen auf die Sicherheit etwas bringt kann ich dir nicht sagen. Warte lieber auf jemanden der mehr Ahnung hat als ich.


wo hast du denn die hash-Methode hergezaubert? :rtfm: Das bringt gar nix, denn für sowas gibt es Rainbow-Tables. Wenn hashen, dann immer mit einem dynamischen Salt.

Also, dein Master-Passwort wird gehasht und gesalzen (Einweg). Die Passwörter der Seiten verschlüsselst du mit deinem Passwort (nicht Hashen, das ist Einweg; du musst die gespeicherten ja auch wieder entschlüsseln können). Mit deinem Master-Passwort kannst du die anderen Passwörter dann auch wieder entschlüsseln.


----------



## crypto (30. Okt 2013)

@Tollpatsch

Also, ich weiß nich so genau wie genau du das umsetzen willst, aber...

Is das ganze ne locale datenbank? wenn nich... wird das ganze schon ganz schön komplex...

Ich rate dir...
für jeden benutzer ein eigenes textfile
anzulegen in dem du benutzernamen un passwort speicherst....
die datei wird dann verschlüsselt...

Dazu brauchst du die JCE (Cipher,SecretKeySPec, etc) sowie MessageDigest un In/outputstreams

Was deine fragen angeht:

1. naja die jce bietet die algorithmen: AES (128bit only) ,blowfish,rc2 ... ich rate dir zum AES oder evtl zu Blowfish
    für alle (sicheren) anderen brauchst du externe libraries

2. normalerweise müsste ein passwort = null zusammen mit System.gc reichen, aber : 1. Du musst auch alle anderen   key-object (SecretKeySpec etc.) löschen un 2. In java hast du keine echte kontrolle über den speicher... 
das macht die VM... deshalb is das in java immer ein wenig problematisch....

wenn du wie @BildschirmUser vorschlägt asymmetrische kryptographie (RSA) einsetzen willst, wirds noch schwerer,
also davon solltest du die finger lassen...





Tollpatsch hat gesagt.:


> gegoogelt habe ich schon habe nach Java Verschlüsselung gegoogelt dort aber entweder nur sehr einfache Verschlüsselungsvarianten gefunden oder hoch komplexe die ich nicht verstanden habe!



Tja, wenn du sicher verschlüsseln willst, is das nun mal nich ne sache von 5 min, das bedeutet, viel lesen, mathematik
un lange übung/erfahrung.... un selbst dann kommen immer wieder fehler vor 



Tollpatsch hat gesagt.:


> Was denkt ihr darüber? Hab ich alle Risiken/Probleme bedacht was so ein Passwortmanager mti sich führt?



Ganz generell glaub ich, dass du nich allzu viel ahnung von kryptographie hast... deshalb empfehl ich dir,
dich erstmal ein bisschen einzulesen, un dann die JCE / JCA studierst... 

Also wenn das nur so zum üben / probieren is ... okay, viel spaß
Ansonsten, lass da mal die finger von, lieber erst mal fertig studieren un in informationssicherheit, falls man das in WI
hat ordentlich aufpassen


----------



## crypto (30. Okt 2013)

calousy hat gesagt.:


> was soll ein statischer und dynamischer Salt bringen? Ein dynamischer reicht aus. Wenn du einen statischen verwendest, kannst du dir auch eine Rainbow-Table damit basteln. Bei einem dynamischen Salt müsstest du dir für jeden möglichen Salt die Hashes für mögliche Passwörter berechnen. Der Aufwand ist also extrem größer..



Also naja, ohne hier ne große diskussion vom zaun zu brechen, salt is gut un schön aber hier(fall) entscheidet eher
das richtige hashverfahren, denn wenn ein vernünfiges passwort gewählt wird, dann is bei SHA-256 aufwärts schnell
schluss mit bruteforcing... zumindest für einen halbwegs realistischen angreifer... Also lieber ein sicheres hashverfahren
ohne salt, als ein wie vorgeschlagen unischeres (MD5) mit....
Aber im prinzip hast du recht... mit salt is eigtl. immer besser...



calousy hat gesagt.:


> wo hast du denn die hash-Methode hergezaubert? :rtfm: Das bringt gar nix, denn für sowas gibt es Rainbow-Tables. Wenn hashen, dann immer mit einem dynamischen Salt.



Also ich denk die is eher schematisch... un nein, hash ohne salt is nich gleich unsicher... ich spar mir auszurechnen
was ein rt-bruteforce auf sha-160 an aufwand kostet... Aber ich glaub, wir sin uns einig, dass es hier (fall) viel 
dringendere baustelle gibt, als das passwort-hashing-verfahren....


----------



## Phash (1. Nov 2013)

Gegen Bruteforce soll helfen, wenn man den Entschlüsselungsalgorithmus so unperformant wie möglich macht. 

Hab da neulich etwas mit einer kaskadierten salt+ hash Lösung gesehen. 

Es wird quasi der hash mit salt erzeugt,  daraus wieder ein hash plus salt usw. 

In dem Beispiel gab es 4 Stufen.
Man meinte,  ein Durchlauf dauert dann einige ZehntelSekunden. Das stört den user nicht , aber brute force dauerte nochmal deutlich länger,  und auch schwache pws werden sicherer


----------

