2011-01-05 28 views
2

Ich möchte eine C# -Anwendung schreiben, die eine Verbindung zur Datenbank herstellen und einige Informationen zurück erhalten muss. Ich dachte, wenn ich nur die Verbindungszeichenfolge in meiner C# -Anwendung direkt, dann kann der Benutzer sehr einfach sein, die Verbindungszeichenfolge und Anmeldung an meinen SQL-Server direkt, sobald das passiert ist, können sie alle gewünschten Informationen auswählen!
Gibt es also eine gute Lösung dafür?
Vielen Dank im Voraus!Wie kann ich die Informationen vertraulich behandeln?

Antwort

1

Ich hatte eigentlich eine ähnliche Anforderung. Ich habe es angesprochen, indem ich meine Verbindungszeichenfolge genommen und sie mit der Rijndael-Verschlüsselungslogik verschlüsselt habe (überprüfen Sie es in System.Security.Cryptography). Es ist sehr einfach zu bedienen. Ein Freund von mir hat versucht, dies in den letzten 19 Monaten zu knacken, indem er eine Reihe von Rainbow-Tischen benutzt - ja, er hat viel zu viel Zeit - und hat mir gesagt, dass "unser Sonnensystem wahrscheinlich dunkel wird, bevor ich kann reinkommen. " Ich lachte. Viel zu viel Freizeit.

Ich nahm einfach meine Verbindungszeichenfolge, die ich in einer XML-Datei speichern (so kann ich es bei Bedarf ändern) und verschlüsselt es. Meine App liest diesen Wert als Teil des Initialisierungsprozesses ein - entschlüsselt ihn - und verbindet und öffnet die Datenbank.

So etwas wie „ich ein Stück von Daten bin, der verschlüsselt ist,“ ..... einmal verschlüsselt endet so etwas wie ..... „V27AsTNsJA + BEwoGR2PbiZum5puwiLbfMa41ens8r8sSiEnn6FiT + k8ImEft Qba8ziCpie94s3bEwcPekqRfhO1Noc8lVeERyezmtqN9/0ZgmzJbNbl/3emTLLfb0Qpj“ .. .. das ist offensichtlich nicht sehr nützlich für jemanden versuchen, einzubrechen.

Es ist erwähnenswert, dass selbst mit einer niedrigen 128-Bit-Verschlüsselung (dies unterstützt auch 256-Bit) erinnern, dass es 2 erhöht zur Macht von 128 möglichen Werten, oder 3.4 e + 38. Denken Sie, was eine große Zahl, die ist:

340.000.000.000.000.000.000.000.000.000.000.000.000

Wenn Sie versuchen, diese zu knacken, beispielsweise mit einer Rate von 1 Billion Versuche pro Sekunde (1.000.000.000.000/Sekunde) es möglicherweise Sie könnte nehmen Sie 3 Millionen Millionen Millionen Jahre, um es zu bekommen. Natürlich könnten Sie es bei der ersten Schätzung bekommen ... wahrscheinlich nicht.

Ein 256-Bit-Schlüssel ist 1,15 e + 77 und ein 512-Bit-Schlüssel ist 1,34 e + 154 mögliche Werte.

+0

So mache ich es auch. – TalentTuner

+1

Während der Initialisierung sagen Sie, dass die Verbindungszeichenfolge entschlüsselt wird. Wird dieser Entschlüsselungsschlüssel auch in der App gespeichert oder wird er zur Laufzeit von Ihnen eingegeben? – Jubal

+0

@jskaggz - Ich kann mir ehrlich gesagt nicht vorstellen, einen Schlüssel oder IV eingeben zu wollen ... Sie würden Fehler machen (zumindest würde ich es tun). Es ist ein Teil der Anwendung selbst, aber es ist verschleiert, falls jemand versucht, die App umzubauen, um es so zu bekommen. Es gibt mehrere Möglichkeiten, dieses Problem zu lösen - meins ermöglicht es mir, aus der Ferne neue Kryptofiles in die App zu übertragen, da die Verschlüsselung auch für die Kommunikation verwendet wird und das Austauschen von Crypto es für alle unmöglich macht, in die Sicherheit einzudringen. – BonanzaDriver

6

Die einzige Möglichkeit ist eine dreischichtige Architektur, bei der Ihre Clientsoftware nicht direkt mit der Datenbank verbunden ist, sondern mit einem Anwendungsserver, der die Datenbankanmeldeinformationen steuert und angibt, welche SQL-Befehle ausgegeben werden.

Es ist auch möglich (unwahrscheinlich), die Berechtigungen einzuschränken, die der Datenbankbenutzer für die Client-Software nur in der Lage sein muss, die Daten auszuwählen, die die Client-App wirklich benötigt (und sonst nichts). Mit diesem Ansatz würden Sie bestimmte Ansichten erstellen und nur ausgewählte Berechtigungen für diese gewähren. Gespeicherte Prozeduren sind ein weiteres Werkzeug hier. Dies kann jedoch wahrscheinlich nicht alle Fälle abdecken und ist ein wenig gefährlich, falls Sie versehentlich zu viel gewährt haben oder ein Fehler in der Datenbank eine Privilegien-Eskalation erlaubt.

Aber wenn Sicherheit ein Anliegen ist, würde ich dreistufig gehen.

+0

Meinen Sie, ich muss eine Datenzugriffsebene schreiben und Zugriffskontrolle auf dieser Ebene hinzufügen?dann jedes Mal, wenn ich Daten auswählen muss, sende ich zuerst meinen Benutzernamen und mein Passwort, nachdem ich autorisiert habe, dann kann ich die Daten bekommen, die ich genehmigt habe? – MemoryLeak

1

Sie müssen die Verbindungszeichenfolge in web.config verschlüsseln. Hier geht es Encrypt. Verwenden Sie außerdem die Windows-Authentifizierung (vertrauenswürdige Verbindung = true). Dies stellt sicher, dass selbst wenn der Benutzer die Anmeldeinformationen hat, er sich immer noch nicht anmelden kann, ohne dass seine ID zu ActiveDirectory/Domain hinzugefügt wird.

Verwandte Themen