2017-02-07 5 views
1

Verzeihen Sie, wenn dies eine dumme und offensichtliche Frage ist, aber ich habe Probleme, nach den richtigen Ressourcen zu suchen. Ich bin kein Sicherheitsexperte und ich kämpfe um zu verstehen, wie richtig gehen Sie darüber.So verschlüsseln und entschlüsseln Sie vertrauliche Informationen in C# ohne ein vom Benutzer eingegebenes Passwort

Hier ist das Szenario. Ich habe eine interne Anwendung auf einem internen Server: nicht etwas, das jemals ausgehen zu einer Client-Site. Diese Anwendung verfügt über eine Datenbank mit Benutzernamen- und Kennwortpaaren, über die Sie mit sicheren Webdiensten kommunizieren können. Ich muss diese Kennwörter nicht vor Kollegen geheim halten, aber ich möchte sie schützen, falls der Server angegriffen wird und die Daten gestohlen werden.

Traditionell würde man sie salzen und hacken. Dies ist ein Prozess, den ich im Prinzip verstehe, aber es hängt davon ab, dass der Benutzer ein Passwort eingibt, das dann gegen den gespeicherten Hash validiert werden kann. Das ist nicht der Fall für mich.

Also: Suchen dort sind verschiedene Lösungen, die eine feste "Passphrase" verwenden, um eine Zeichenfolge zu sichern. Hier ist ein Beispiel, https://stackoverflow.com/a/10177020/271907 und hier ist ein weiteres https://stackoverflow.com/a/10366194/188474.

Jedoch, wie ich es verstehe, bietet keiner von diesen eine nützliche Lösung in meinem Fall. Diese "Passphrase" muss irgendwo für meine Anwendung gespeichert werden, um ihre Arbeit zu tun. Wenn ich es in die Anwendung festcode, kann es reverse engineered sein. Wenn ich es verschlüssle und es in eine separate Datei lege, kann es gestohlen und mit einem Regenbogen-Tisch ausgearbeitet werden.

Ich schaute in die Verwendung von reg_iis, um einen Schlüssel nach Encrypting Web Config using ASPNET_REGIIS zu verschlüsseln, aber um ehrlich zu sein, das ließ mich nur noch mehr verwirrt. Ich bin nicht einmal sicher, ob diese verschlüsselten Konfigurationsdateien zwischen den Computern portiert werden können oder ob ich zwischen Dev und Test und Live neu verschlüsseln müsste. Ich weiß auch nicht, wie sicher sie sind: AFAIK dort muss ein Schlüssel irgendwo sein und wenn es einen Schlüssel gibt, kann es kaputt gehen.

Um das Wasser weiter zu verdrecken, fand ich diese Antwort, die keinen Schlüssel verwendet: https://stackoverflow.com/a/10176980/271907. Allerdings gibt der Autor zu, dass es veraltet ist und ich habe keine Ahnung, wie sicher das Ergebnis ist.

Gibt es irgendeinen vernünftigen Ansatz zur Lösung dieses Problems, der irgendwo kein Loch in der Sicherheit hinterlässt?

+0

"Diese Anwendung verfügt über eine Datenbank mit Benutzernamen und Passwortpaaren, die verwendet werden, um mit sicheren Webdiensten zu kommunizieren" - Sie müssen also Zugriff auf die Klartextkennwörter haben, damit Sie den Benutzernamen \ password an den jeweiligen Webdienst senden können mit wem willst du reden? –

+0

Können Sie diesen Zusammenhang klären? "Diese Anwendung verfügt über eine Datenbank mit Benutzernamen- und Passwortpaaren, die verwendet werden, um mit sicheren Webdiensten zu kommunizieren. Ich muss diese Kennwörter nicht vor Kollegen geheim halten." Wird sie in der Datenbank als reiner Text und statische Werte gespeichert? – jtabuloc

Antwort

1

Jede Lösung, in der Sie das Kennwort entschlüsseln, um zu überprüfen, dass es geht grundsätzlich unsicher, weil Ihre Anwendung immer wissen muss, wie diese Entschlüsselung zu tun.

Sie können es schwieriger machen, indem Sie den Entschlüsselungsschlüssel nicht im Code speichern, aber wo auch immer Sie einen Hacker setzen, der Ihren Code kompromittieren kann, kann wahrscheinlich auf alles zugreifen, auf das er zugreifen kann.

Auch wenn Ihre Anwendungssicherheit sehr solide ist; Ihre Passwörter sind immer noch Klartext in Ihrer Datenbank und wenn das kompromittiert wird, dann sind viele Ihrer Benutzer ausgesetzt.

Das sagte - das ist ein nur internes, risikoarmes System. Ihre beste Vorgehensweise könnte darin bestehen, Ihre Chefs über das relative Risiko im Vergleich zu den Kosten für angemessene Sicherheit zu informieren und sie dazu zu bringen, einen expliziten Geschäftsanruf zu führen (und in die Zukunft zu gehen).

Die nur Weg dies zu tun, ohne ein Loch in der Sicherheit zu verlassen, ist durch Hashing und Salzen der Passwörter mit einem Einweg-Algorithmus.Die Tatsache, dass aktuelle Passwörter einfache Texte sind, sollte kein Problem sein - es gibt viele Möglichkeiten, Benutzer zum Verschlüsseln zu bewegen, aber am einfachsten ist es nur, wenn sie sich anmelden, wenn sie ein Klartext-Passwort haben verschlüsseln Sie es. Dann, nach einer angemessenen Wartezeit (abhängig davon, wie oft sich Ihre Benutzer einloggen), entfernen Sie das alte Passwort und prüfen Sie es mit dem neuen Hash.

Die goldene Regel ist: wenn Sie Passwörter speichern Sie müssen Hash sie in einer Weise, die Sie nicht

Die einzige andere Option rückgängig machen kann für Sie gar nicht authentifizieren - verwenden NTLM oder AD oder OAuth, um einen anderen Dienst zu erhalten, um den Benutzer zu authentifizieren und stattdessen dieser Quelle zu vertrauen.

Wenn Sie stattdessen nach den Anmeldeinformationen suchen, die die Anwendung selbst verwendet, haben Sie ein ähnliches Problem, aber der Fokus verschiebt sich. Sie können immer noch nicht viel tun, um eine Gefährdung zu vermeiden, wenn der Hostcomputer kompromittiert ist, aber die meisten Angriffe richten sich nur auf Dateien.

Dies kann ein Problem sein, wenn alle Ihre Verbindungsdetails in einem web.config oder appsettings.json gehalten werden, da die Kompromittierung dieser Dateien Ihren SQL-Server oder andere Dienstkennwörter offen legen kann.

Hier können Sie ASPNET_REGIIS verwenden - Sie können geheime Konfigurationen hinzufügen, auf die IIS zugreifen kann, die jedoch nicht im Nur-Text-Format mit den Web-Dateien gespeichert werden.

In .NET Kern gibt es neue Microsoft.Extensions.SecretManager.Tools, die das gleiche tun.

Beides fügt eine Schutzebene für Anmeldeinformationen für Anwendungen hinzu, die ansonsten im Nur-Text-Format auf der Festplatte gespeichert würden. Angreifer müssen die Maschine kompromittieren, um an sie zu gelangen, und nicht nur die Dateien.

In beiden Fällen sind diese Konfigurationsdetails nicht mehr tragbar - Sie müssen sie auf jedem Server neu einrichten (und erneut verschlüsseln).

Sie brauchen jedoch nur den zusätzlichen Schutz in Live - in Entwicklung oder Test Sandboxes können Sie einfach die Nur-Text-Konfiguration verwenden, und dann überschreiben Sie die Details mit den verschlüsselten Einstellungen auf dem Live-Server.

+3

Bei dieser Frage geht es nicht um Benutzerkennwörter. Es geht darum, die Anmeldeinformationen für Dienstkonten zu schützen, ein grundlegend anderes Problem. – Xander

+0

@Xander Ich habe die Antwort geändert. – Keith

Verwandte Themen