Java Sicherheit der Programme

S

Sasku

Gast
Hallo zusammen,

In letzter Zeit habe ich mich, neben einigen anderen Projekten auch mit IT-Sicherheit befasst. Nun bin ich dadurch ein bisschen am überlegen ob Programme überhaupt sicher sein könnten.
Jetzt habe ich eine Verschlüsselungsmethode im Internet gefunden, die einen string durch AES 128 verschlüsselt. Allerdings gibt es dazu keine überladene Methode die ein Char Array erwartet, sondern nur einen klaren string.

Nun gibt es ja Tools, wie z. B. wireshark, um den Arbeitsspeicher anzuhören.. Aber wird dann der string der der Methode, oder generell strings in einem Programm, übergeben wird nicht ausgelesen?

Also inwiefern kann da etwas sicher sein..?

Kann mir da jemand eine gewisse Erklärung geben?
 
Inwiefern sollte denn ein char array sicherer sein, als ein String? Ist doch nahezu kein Unterschied, abgesehen davon, dass ein String ein encoding hat, der für dich als Mensch leichter lesbar erscheint.

Des Weiteren ist wireshark, wie schon der Name aussagt, zum Schnüffeln in Datenpaketen, die durch die Kabel fliegen - also nicht zum RAM auslesen.

Um es kurz zu machen - wenn jemand unbehelligt in deinem Arbeitsspeicher rumfummeln kann, dann hast du ganz andere Sorgen als den String, der da ggf. im Klartext vorliegt. Die sichere Übertragung ist in der Regel viel relevanter.

Ansonsten lies mal hier: http://security.stackexchange.com/questions/29019/are-passwords-stored-in-memory-safe
 
Tumbleweed schrieb:
Inwiefern sollte denn ein char array sicherer sein, als ein String? Ist doch nahezu kein Unterschied, abgesehen davon, dass ein String ein encoding hat, der für dich als Mensch leichter lesbar erscheint.

Siehe hier. Aber auch ein Char-Array ist nur bedingt sicherer.
 
Zuletzt bearbeitet:
Interessant und einleuchtend, allerdings wird es ja auch schon in der Antwort relativiert.
 
Danke für die Antworten.. ^^

Gut dann hat uns unser Berufsschullehrer scheiße erzählt (wundert mich bei dieser Schule nicht ^^) .. Ist also nur für das Netzwerk. Danke!

Naja ein Char Array ist natürlich auch nicht wirklich sicher das stimmt..Aber dennoch sicherer als ein string..^^

Danke jedenfalls..meine Bedenken sind dahin :)

(Naja man kann bestimmte Methoden von USB sticks von Kollegen oder Freunden bekommen ;))
 
Aber dennoch sicherer als ein string..^^
Nicht, dass ich viel Ahnung von Java-Internals hätte, aber was genau ist an einem Char-Array "sicherer" als an einem String? Ein String ist normalerweise nichts anderes als ein Char-Array.

Zum Thema RAM: crypto++ sorgt zum Beispiel dafür, dass Buffer, in denen sicherheitskritische Daten (v.a. für Keys usw.) gespeichert werden, nach der Benutzung mit Nullen überschrieben werden. Das kann durchaus sinnvoll sein, weil die Daten sonst ggf. von einem bösartigen Prozess, der ganz viel Speicher allokiert und nicht initialisiert, gelesen werden könnten.
 
Zuletzt bearbeitet:
Die Sicherheit der Verschlüsselung wird eher an anderen Stellen untergraben werden als im Arbeitsspeicher. Wie zum Beispiel kommt der verschlüsselte String in das Programm? Wird er von der Tastatur eingegeben, dann könnte ihn ein Keylogger mitschneiden, kommt er über das Netzwerk kann dort (bei unzureichender / fehlender Verschlüsselung) z.B. mit Wireshark mitgeschnitten werden. Kommt er per copy und paste von irgendwoher, dann gibt es auch hier die Möglichkeit, die Daten auszulesen.
Ich denke man darf in den meisten Fällen davon ausgehen, dass das verschlüsselnde System vertrauenswürdig sein sollte.
 
VikingGe schrieb:
Nicht, dass ich viel Ahnung von Java-Internals hätte, aber was genau ist an einem Char-Array "sicherer" als an einem String? Ein String ist normalerweise nichts anderes als ein Char-Array.

Siehe Link weiter oben.

Strings sind in Java immutable. Wenn du in einem String also ein Passwort abgelegt hast und ihn nach der Verwendung überschreiben möchtest, dann geht das mit einem String nicht. Selbst wenn er nicht mehr referenziert wird, und selbst dann wenn der GC zeitnah drüberfährt, wird der String wegen des intern verwalteten String-Pools (eine Art Cache für Strings, so dass mehrfach auftretende, gleiche Strings nur einmal im Speicher landen) eine ganze Zeit lang nicht entfernt werden, vielleicht sogar erst, wenn sich der ganze Prozess beendet.
Den Inhalt eines Char-Arrays kannst du theoretisch hingegen nach der Verwendung überschreiben, weil es mutable ist. Ja, Strings nutzen intern ein Char-Array, aber das lässt sich von außen nicht manipulieren.

Die Haken sind jedoch
a) der GC verschiebt manchmal zur Optimierung Objekte auf dem Heap. Die alte Speicherstelle ist zwar wieder "freigegeben", beinhaltet aber bis zur Überschreibung durch andere Objekte die alten Daten. Wenn das passiert, solange man das Char-Array nicht abgeändert hat, steht das Passwort am Ende also einmal in alter Form und einmal in überschriebener Form im RAM
b) solange das char-Array mit dem tatsächlichen Passwort befüllt ist, kann man das natürlich trotzdem aus dem RAM auslesen, nur das zeitliche Fenster ist kleiner. Aber wenn eh schon jemand Zugriff auf den Speicher hat, dann hat man andere Probleme.
 
Zuletzt bearbeitet:
Zurück
Oben