# Benutzerrechte im Programm vergeben



## Antimon (24. Feb 2009)

Hallo zusammen,

ich bin auf der Suche nach ein paar Tips, wie ich eine halbwegs vernünftige Benutzerverwaltung in mein Programm integrieren kann. Geht das irgendwie oder ist Java dafür nicht sonderlich gut geeignet?

Also vorab - ich habe mit PHP/MySQL usw. schon häufig mit Benutzern und deren Rechten rumhantiert, nur sind dort die Infos auf einem Server gespeichert und da kommt normalerweise niemand ran.

Wenn ich aber für eine Applikation Benutzerrechte vergebe, muss ich die ja irgendwo lokal speichern. Also ist das erste Problem: Wie soll so eine Datei aussehen? Ich könnte eine XML verwenden, aber da kann jeder nach Lust und Laune editieren und zumindest Einträge löschen, selbst wenn die Passwörter verschlüsselt sind. Also irgendeine Binärdatei verwenden?

Und wie ist da ein vernünftiger Ansatz? Auf die Datei muss ja prinzipiell jeder Benutzer zugreifen können um "seine" Rechte auslesen zu können, darf diese aber auch nicht manipulieren können. Und mit einem im Programmcode hinterlegten Master-Passwort zu arbeiten ist bei Java vermutlich auch nicht sonderlich sicher, vor allem nicht wenn es sich um ein quelltextoffenes Programm handelt.

Gibts da also überhaupt einen vernünftigen Schutz oder kann ich das gleich vergessen (zumindest ohne externe Datenbanken oder so)? Also es geht mir nicht um geheime Bankdaten oder so, sondern lediglich ein halbwegs sicherer Manipulationsschutz, damit sich Leute nicht ohne weiteres Admin-Rechte holen können beispielsweise.


----------



## SlaterB (24. Feb 2009)

> damit sich Leute nicht ohne weiteres Admin-Rechte holen können beispielsweise.

wenn es eine Neuvergabe von Rechten gibt, dann kann sich doch jeder Nutzer beliebige Rechte zuteilen,
ob direkt in der Datei oder im Menü des Programms, das ist schon egal,

oder kann nur ein höhergestellter User anderen niederen Rechte vergeben?
wie sieht das ganze inital aus, wenn noch gar nichts eingestellt wurde?

geht man davon aus, dass ein oberster Richter korrekt angelegt ist, dann die von diesen abgelegten Rechte verschlüsseln, 
also bei asymmetrischer Verschlüsselung mit dem privaten Schlüssel des höheren verschlüsseln,
so dass sie mit dem öffentlichen dann noch auslesbar und anwendbar sind,

nun kann jemand die ganze Datei löschen, aber dann hat eben niemand irgendwelche Rechte, 
bis der oberste Rechtevergeber das ganze wieder einrichtet (wenn das auch der löschende sein kann, dann ist das schlecht),
genausogut kann man das ganze Programm löschen,

ob asymetrische Verschlüsselung mit Eingabe eines einfachen achtstelligen Passwort geht, weiß ich freilich nicht,
evtl. die längeren Schlüssel ablegen und nur mit dem einfachen Passwort verschlüsseln..

-------

abgesehen von der Integrität des obersten Rechte-Verschenker:
Problem wäre vielleicht noch, wenn es eine einmal fertig signierte Rechtevergabe gibt,
die sich jeder auf sein lokales System kopiert und einen passenden Usernamen anlegt

da bräuchte es irgendwas eindeutiges im Programm und in der Rechte-Datei,
die Mac-Adresse der Netzwerkkarte oder so, die Systemzeit der Installation,
falls man die in der Registry sicher ablegen kann (dann könnte man aber auch da die Nutzerrechte sicher speichern..)
keine Ahnung 

http://entwickler-forum.de/showthread.php?t=52812


----------



## Gast2 (24. Feb 2009)

Moin,



Antimon hat gesagt.:


> Wie soll so eine Datei aussehen? Ich könnte eine XML[...]


XML ist gerade zu prädestiniert für diese Aktion



> Auf die Datei muss ja prinzipiell jeder Benutzer zugreifen können um "seine" Rechte auslesen zu können, darf diese aber auch nicht manipulieren können.


jeder Benutzer hat darf eine Datei lesen, sofern die Datei von root (unter WiXP/Fista auch Administrator genannt) dafür vorgesehen wurde ... nicht jeder Benutzer darf in eine Datei schreiben, sofern die Datei von root (unter WiXP/Fista auch Administrator genannt) dafür vorgesehen wurde



> Und mit einem im Programmcode hinterlegten Master-Passwort zu arbeiten ist bei Java vermutlich auch nicht sonderlich sicher,


das hat nichts mit Java zu tun ... das Reverse Engineering lässt sich auch auf C und Assembler anwenden (gut Aufwand für Ergebnisse ist größer)



> Gibts da also überhaupt einen vernünftigen Schutz oder kann ich das gleich vergessen (zumindest ohne externe Datenbanken oder so)? Also es geht mir nicht um geheime Bankdaten oder so, sondern lediglich ein halbwegs sicherer Manipulationsschutz, damit sich Leute nicht ohne weiteres Admin-Rechte holen können beispielsweise.


wie oben schon angedautet ... nutze einfach die Möglichkeiten die das entsprechende Betriebsystem bietet ... Du kannst nicht anders ... wenn der Kunde keine Sicherheit auf seinen Rechnern wünscht, kannst Du auch nichts machen ... Du bist Programmierer und kein Zauberer

in einem aktuellen Projekt habe ich einfach einen Registry-Key angelegt der nur True oder False enthält um das Admin-Menü frei zu schalten ... wenn auf den Rechnern auch die Bediener mit Adminrechten arbeiten und sich das Menü freischalten - nicht mein Problem

hand, mogel


----------



## SlaterB (24. Feb 2009)

quasi ein Server auf dem eigenen Rechner 


Antimon hat gesagt.:


> Also vorab - ich habe mit PHP/MySQL usw. schon häufig mit Benutzern und deren Rechten rumhantiert, nur sind dort die Infos auf einem Server gespeichert und da kommt normalerweise niemand ran.


----------



## Antimon (25. Feb 2009)

Hmm... okay dass jemand der Admin-Rechte auf dem Rechner hat, das löschen oder bearbeiten kann, ist klar... und dass es eine 100%ige Sicherheit nicht gibt, auch. 

Das heisst wohl es würde auf ne Private-/Public-Key-Verschlüsselung hinauslaufen? Gibts da evtl. bekannte Libs für Java, die man sich zu Nutze machen könnte?

Mit reinen Dateirechten und Registry würde ich nur ungern arbeiten, erstens weil das Ganze betriebssystemunabhängig laufen soll und zweitens weil ich mir vorstellen könnte dass es mit so recht systemnahen Aufrufen mit Java Probleme geben könnte - wobei ich mich da vermutlich täusche.

Wie würde denn das Ganze ablaufen wenn ich den anderen Weg gehen würde, also ein Passwort abspeichern möchte, das für den Login bei einem anderen Programm benötigt wird? Wenn nur überprüft werden soll (z.B. beim Programmlogin) ob ein Passwort stimmt, kann ich mir nen MD5-Hash davon abspeichern und dann den gespeicherten mit dem aktuellen Hash vergleichen - allerdings ist der gespeicherte Hash (zumindest theoretisch) nicht wieder in ein Passwort wandelbar. Wenn ich aber grad das möchte, wie gehe ich da am besten vor ohne dass der Benutzer jedes Mal ein Passwort eingeben muss?

Das letztere ist übrigens unabhängig vom ursprünglichen Problem...


----------



## Wildcard (25. Feb 2009)

Antimon hat gesagt.:


> Wie würde denn das Ganze ablaufen wenn ich den anderen Weg gehen würde, also ein Passwort abspeichern möchte, das für den Login bei einem anderen Programm benötigt wird? Wenn nur überprüft werden soll (z.B. beim Programmlogin) ob ein Passwort stimmt, kann ich mir nen MD5-Hash davon abspeichern und dann den gespeicherten mit dem aktuellen Hash vergleichen - allerdings ist der gespeicherte Hash (zumindest theoretisch) nicht wieder in ein Passwort wandelbar. Wenn ich aber grad das möchte, wie gehe ich da am besten vor ohne dass der Benutzer jedes Mal ein Passwort eingeben muss?


Am besten finde ich den Eclipse Secure Storage. Dafür solltest du deine Anwendung dann in Equinox laufen lassen. Der Secure Storage macht sich zunutze was das Betriebssystem bietet und verschlüsselt damit die Daten. Auf MacOS den Keyring, auf Windows die Login Informationen usw.
Damit wird sichergestellt das nur ein ordentlich angemeldeter Benutzer seine Daten wieder entschlüsseln kann.


----------



## Antimon (22. Mrz 2009)

Hmm das werd ich mir mal ansehen - allerdings für ein oder zwei nicht allzu sensible Passwörter, rentiert es sich da den Overhead von Equinox in Kauf zu nehmen oder gibt es da eine praktischere Alternative?


----------

