# Passwörter sicher ablegen



## Rahmspinat (9. Nov 2011)

Hallo Leute,

ich will ein Programm schreiben das Lokal ausgeführt wird.

Dieses Programm muss Passwörter nutzen um auf bestimmte APIs zugreifen zu können.

Nicht jeder soll wissen wie diese Passwörter sind, sondern das Programm einfach nur nutzen.

Das Problem das ich mit Verschlüsselung solcher Passwortdateien habe ist, das man die .jar Dateien ja wieder in lesbaren code umwandeln kann und dann die verwendete verschlüsselungsmethode sehen kann.

Wie kann ich die Passwörter also sicher verstecken?

Habt ihr einen Tipp für mich oder ein ähnliches Problem schon gehabt?

Wie habt ihr das gelöst?


----------



## RySa (9. Nov 2011)

Speicher die Passwörter doch einfach mal als MD5 checksum ab, und wandle die eingegebenen Passwörter (zum einloggen nehme ich an) ebenfalls in MD5 und vergleiche die beiden bei der Passwort abfrage. Du könntest auch vielleicht ne kleine Datenbank benutzen, aber es wäre glaube ich "mit kanonen auf Spatzen schießen". Versuch es einfach mit der MD5-Checksum, das wird für einen "normalen Benutzer" nicht zu entschlüsseln sein.


----------



## turtle (9. Nov 2011)

Mir wird immer mulmig, wenn ein Client-Programm Passwörter "irgendwo" ablegen muss.

Ich empfehle hierfür einen Zwischenserver (Proxy). 

Also Dein Client-Programm fragt Deinen (einzurichtenden) Server nach "Dingen" über eine bestimmte API. Dein Server leitet die Anfrage mit dem korrekten Passwort an die richtige API weiter. Somit muss Dein Client-Programm überhaupt keine Passwörter kennen (und speichern), sondern dies Aufgabe des Servers, der unter Deiner Kontrolle steht.


----------



## SlaterB (9. Nov 2011)

der Benutzer soll ja nichts eingeben 
und es geht gerade darum vor dem die Passwörter zu verbergen, nicht dessen Passwörter zu speichern

@Rahmspinat
mal eine andere Betrachtung:
wenn du Angst hast, dass die Passwörter aus dem Quellcode gelesen werden können, obwohl dort vielleicht kompliziert mit Code zusammengesetzt,
was spricht dann eigentlich gegen einen generellen Umbau des Programms durch einen Angreifer, 
so dass es zwar weiterhin das 'sichere', unbekannte Passwort verwendet, 
aber genau über diesen vorhandenen Kanal die neuen Daten sendet und empfängt die der Angreifer haben möchte?

ein ähnliches Thema, wenn auch bisher nicht unbedingt mit wertvollen Erkenntnissen:
http://www.java-forum.org/netzwerkprogrammierung/125719-highscore-online-speichern.html


----------



## Andi_CH (9. Nov 2011)

MD5 ist vielleicht etwas zu banal, weil die Checksumme vermutlich kürzer als das Passwort ist und somit verschiedene Passwörter zu derselben MD5 Checksumme führen.

Wenn du etwas Sicheres willst, such danach wie Linux/Unix das macht - die verwenden IMO (und aus dem Gedächnis widergeben) einen Algortihums bei dem das Resultat mindestens so lang wie das eingegeben Passwort ist (Stichwort salt and pepper). Der Algorithum ist nicht umkehrbar - das heisst du kannst das Passwort nicht mehr rekonstruieren. Das ist auch nicht nötig, denn ein eingegebenes Passwort wird chiffriert und die beiden Chiffrate miteinander verglichen.


----------



## Rahmspinat (11. Nov 2011)

Hallo Leute,

danke für die vielen Antworten, sorry für die späte Rückmeldung 

@RySa: Das Programm wird zwar nur Firmen intern genutzt aber ich kenne die ganzen Leute nicht die es nutzen werden, daher ist für mich nicht Einschätzbar, ob sie damit etwas anstellen können oder nicht. Ich will keine Probleme bekommen weil ich jetzt sage: "ach das passt schon so" 

@turtle: Mir wird da auch mumlig, deswegen wollte ich mal fragen was es da so für Möglichkeiten gibt. Man weiß ja nicht was man nicht weiß . 
Darüber das Passwort auf einen Server auszulagern, der dann die Abfragen für den Client übernimmt, hab ich auch nachgedacht, das ist denke ich, wie ich das jetzt mitbekommen habe, die beste und sicherste Methode.

@SlaterB: interessante Betrachtungsweise. Das gibt einem ja ein ganz mulmiges Gefühl  noch ein Punkt der für eine Auslagerung auf einen Server spricht.

@Andi_CH: Leider muss ich das Passwort wieder rekonstruieren, weil ich mich für die API identifizieren muss.


Ich denke ich werde das wirklich so machen, dass ich die direkte Kommunikation mit der API auf einen Server auslagere. Dort stelle nur alle Methoden zur Verfügung die der Client wirklich braucht, damit er keinen Mist machen kann. Die Schnittstelle zum Server werde ich wieder mit einem Passwort ausstatten, dessen Verlust dann aber dann nicht so schlimm ist wie das Passwort zur API.

Danke für eure Antworten. Wenn ihr noch etwas anmerken möchtet, immer her damit


----------



## freez (12. Nov 2011)

Rahmspinat hat gesagt.:


> @turtle: Mir wird da auch mumlig, deswegen wollte ich mal fragen was es da so für Möglichkeiten gibt. Man weiß ja nicht was man nicht weiß .
> Darüber das Passwort auf einen Server auszulagern, der dann die Abfragen für den Client übernimmt, hab ich auch nachgedacht, das ist denke ich, wie ich das jetzt mitbekommen habe, die beste und sicherste Methode.



Jetzt mal ehrlich: lass doch gleich dass Passwort auf dem Server weg (mal banal gesprochen). Du hast ein sicheres System, welches du mit einem Proxy aushebeln willst. Sollte es nicht dein Server sein, von dem die Daten gelesen werden sollen, solltest du mal mit dem Server Owner reden, ob er so einen Zugriff überhaupt erlauben möchte, da ja über so einen Proxy prinzipiell jeder Daten austauschen kann. Genauso verhält es sich mit einem Client, wenn er keine Authentifizierung nutzt und ich als "Angreifer" nur deine Software benötige.

Machen wir es kurz: Hier muss man genau analysieren, was du vorhast, um die sicherste Variante zu finden. Wichtig wäre:

welches Protokoll wird benutzt um mit dem Server zu komunizieren
wie sicher müssen diese Daten auf dem Server vor Zugriff geschützt sein? Kann man vielleicht readonly Accounts nutzen?
Hat dein Client bereits eine Authentifizierung
Wie Authentifizieren sich die anderen User an dem Server
Gehört dir der Server mit dem Daten ausgetauscht werden soll?
Kannst du mit dem Serverowner dein Problem evtl. besprechen? Vielleicht hat er ja eine Idee, wie man dein Problem einfacher mit dem Server ändern kann?
Was spricht denn eigentlich dagegen, dass die User personalisierte Accounts auf dem Server bekommen und in deinem Client diese Informationen eingeben?
muss deine Anwendung unbedingt lokal ausgeführt werden, oder kann es auch eine Webanwendung sein, wo die Zugangsdaten nur auf dem Webserver geschützt liegen?

Vielleicht gibt es noch mehr Fragen, aber momentan fällt mir nicht mehr ein.


----------



## Jvooy (14. Nov 2011)

jop einfach in ein Hashcode umwandeln:

MD5-Hash-Generator: Eine Zeichenkette per MD5-Hash verschlüsseln

und dann speichern. Wenn du das getan hast, kann man es nicht wieder "zurück wandeln".
Daher musst du jetzt zum überprüfen, ob das Passwort richtig ist, die Eingabe des Users in einen Hashcode umwandeln und die "Strings" vergleichen. 

Dafür sind deine Passwörter sicherer.


Gruß


----------



## Rahmspinat (21. Nov 2011)

Danke für die weiteren Einträge 

@freez:

Der Server gehört mir nicht und Besitzer werden mir auch nicht großartig zuhören.

Was spricht denn eigentlich dagegen, dass die User personalisierte Accounts auf dem Server bekommen und in deinem Client diese Informationen eingeben? -> finde ich eine gute Idee, werde ich machen

muss deine Anwendung unbedingt lokal ausgeführt werden, oder kann es auch eine Webanwendung sein, wo die Zugangsdaten nur auf dem Webserver geschützt liegen? -> aus Zeitgründen muss das erstmal alles lokal durchgeführt werden. Das Grundprogramm dazu steht schon, wurde schon in einem sehr kleinen Kreis oft genutzt

Danke für deinen Beitrag, der hat mich nochmal auf ein paar andere Gedanken gebracht 

@Jvooy: Das ganze werde ich zur Passwortübermittlung zwischen Client und Server nutzen, danke


----------

