| 

.NET C# Java Javascript Exception

5
Hallo in die Runde!

Ich versuche seit einiger Zeit ein Konzept für die Datenhaltung einer Software zu entwerfen, die Personendaten verwalten soll.
Als Desktop-Entwickler hätte ich direkt gesagt: "Alles klar - Software, kleine lokale Datenbank oder von mir aus auch ein SQL-Server im Netzwerk und gut."

Die Herausforderung (zumindest für mich) ist aber die, dass die Nutzer autark arbeiten und bestenfalls einen Internetzugang haben. Die Daten sollen aber auch dann zur Verfügung stehen, wenn (temporär) kein Internetzugang vorhanden ist. Dass die Daten möglichst zeitnah synchron laufen sollen, versteht sich natürlich auch von selbst (so ein Programmierer drückt schließlich nur ein paar Knöpfe und dann ist alles fertig).

Da die Daten personenbezogen sind, müssen sie natürlich verschlüsselt sein. Idealerweise liegt nichts im Internet, was Unberechtigte irgendwie verwenden könnten.

Und zu allem kommt noch hinzu, dass viele Benutzergruppen mit verschiedenen Daten über ein und den selben Kommunikationsweg austauschen sollen (sprich wenn etwas synchronisiert wird, soll das über einen zentralen Server laufen).

Meine erste Überlegung dazu ist, die Daten lokal zu ver- bzw. zu entschlüsseln. So geht nichts Unverschlüsseltes nach draußen.
Aber wie die Datenhaltung selbst realisieren? Jedem einzelnen Nutzer eine Datenbank lokal geben und die mit einer DB im Internet replizieren?
Datensätze als einzelne xml-Dateien ablegen und die dann online "tauschen"?
Wie geht man mit Konflikten um?

Mir will einfach kein schlüssiger Lösungsansatz einfallen. Kann mir bitte jemand auf die Sprünge helfen?

Vielen vielen Dank!

Viele Grüße

Raik Wehner
26.09.2014
5stroke 33 4
Sollen sich mehrere Nutzer den selben Datenbestand teilen, oder hat jeder Nutzer seine eigenen Daten?
phg 29.09.2014
Hallo phg!
Ja und nein :-)
Es geht um verschiedene Nutzergruppen mit zu trennenden Datenbeständen. Innerhalb der Gruppe soll aber auf den gleichen Datenbestand zugegriffen werden.
5stroke 30.09.2014
3 Antworten
3
Hallo Raik,

ich entwickele gerade eine App/Anwendung für den Schulbereich, wo es darum geht, dass Devices (Rechner/Tablets/Smartphone) mit einander Daten austauschen können.
Ich hatte ähnliche Gedanken wie Du.
Den Wartungsaufwand mit lokalen Netzen oder Servern will ich dabei vermeiden.

So bin ich zu der Lösung gekommen:
- Lokal eine nicht verschlüsselte Sqlite DB zu verwenden
- In der Cloud die SQlite Tabelle verschlüsselt unter Azure zu persistieren
- Azure Notifications zur Kommunikation zu verwenden.

Es findet eine Syncronisierung von Cloud und lokale DB statt, gesucht wird lokal, da Cloud verschlüsselt.

Bei Bedarf kann man Auch IOS oder Android devices integrieren.
28.09.2014
judgy 3,0k 1 1 8
Vielen Dank! Ich werde das demnächst ganz sicher ausprobieren. Das Projekt läuft nur ehrenamtlich - von daher kann meine Rückmeldung etwas auf sich warten lassen.
5stroke 30.09.2014
1
@Raik, Du kannst Dir einen kostenlosen Azure Test Account anlegen. Im Azure Portal kann man sich dann recht einfach Testanwendungen erzeugen und den Sourcecode runterladen.
judgy 30.09.2014
2
Bevor Du personenbezogene Daten in einer Clouddatenbank speicherst, solltest Du wissen welche rechtliche Grundlagen hier zu beachten sind. Verschlüsselung alleine reicht nicht.
Stichpunkte: Auditing, Einwilligung, Standort etc.
Mein Tipp: sich einen Fachanwalt suchen und beraten lassen.
01.10.2014
Jaksa 4,0k 1 8
1
So wie judgy es schon vorschlägt kannst du natürlich die Datenbank in die Cloud auslagern. Das kostet nicht viel ist aber relativ ausfallsicher. Cloudanbieter sind hier Microsoft (Azure), Amazon, EnterpriseDB, Google, Oracle, u.v.m.. Von XML würde ich in den meisten fällen abraten da du hier probleme beim skallieren bekommst.

Beispiel Azure SQL DB: ab €0,005/Stunde (~€4/Monat) für einen SQL-Server in West-Europa

Alternativ kannst du lokal eine Sqlite, Firebird oder SQL Server Express Datenbank verwenden und entweder die Datenbank komplett oder die Datensätze verschlüsseln.

Als Key solltest du eine GUID (Globally Unique Identifier) nehmen, da du diese auf dem Client erzeugen kannst. Autoincrement-ID's müssen immer von Server erzeugt werden, da sie fortlaufend sind. Bei GUID's ist die Kollisionswahrscheinlichkeit geriing, sie beträgt 2^(128-6) (128 Bit - 3 Bit Versionsinfo - 3 Bit Variante).

Somit kannst du auf dem Client neue Daten erzeugen und zu einem späteren Zeitpunkt zum Server syncen ohne das Problem mit den Konflikten zu haben.

Transporttechnisch kannst du viele Wege gehen. Von WebApi ober WebServices bis hin zu Socksverbindung. Bei jedem Protokoll was nicht auf HTTP basieret hast du das Problem das deine Anwendung hinter nicht SOCKS fähigen Proxy-Servern keine Verbindungn zu deinem Server bekommen kann. Wenn du stattdessen ein auf HTTP basierendes Protokoll verwendest (WebApi, WebServices, WCF:httpBinding) kannst du zur Datenübertragung trotzdem verschiedene Formate verwenden, z.B.: XML (sehr ineffizent), JSON (gut lesbar), ProtoBuff (schlecht lesbar, bei großen Datenmengen aber sehr schnell), BinarySerialisation (ähnlich ProtoBuff, aber etwas größerer Output m.w.n.).
30.09.2014
Floyd 14,6k 3 9
Floyd 14,6k 3 9

Stelle deine Datenbank-Frage jetzt!