C # Verschlüsselung im Zeitalter des Reflektors

8

Ich habe ein Programm, in dem das Passwort für eine Datenbank von einem entfernten Benutzer festgelegt wird. Das Programm speichert den Benutzernamen und das Passwort in einer verschlüsselten Zeichenfolge in einer XML-Datei, die ansonsten für den Benutzer lesbar sein sollte. Nun, das funktioniert gut, ich benutze die C # DES-Verschlüsselung mit einem Schlüssel und es wird verschlüsselt und entschlüsselt. Jetzt ist das Problem, dass jeder Reflektor verwenden kann, um den Schlüssel zu sehen. Selbst mit Verschleierung sollte der Schlüssel leicht ersichtlich sein. Wie geht man damit um? Nun, ich brauche das nicht, um NSA sicher zu sein, aber ich möchte wirklich verhindern, dass jemand späht. Danke.

EDIT: Vielen Dank für all die bisherigen Ratschläge, Informationen über diese Art von Dingen sind nicht sehr weit verbreitet, und ich schätze sowohl allgemeine Tipps als auch spezifische Antworten.

    
Steve 16.07.2009, 19:42
quelle

6 Antworten

8

Versuchen Sie DPAPI (System.Security.ProtectedData-Klasse) zu verwenden. Dies schützt Ihre verschlüsselten Daten mithilfe der Benutzer- oder Computeranmeldeinformationen. Daher kann nur das Benutzerkonto, das auf die Daten zugreift (Benutzeranmeldeinformationen) oder ein Benutzer, der sich beim Computer anmelden kann (Computeranmeldeinformationen), Ihre Daten entschlüsseln können.

    
Joe 16.07.2009, 19:50
quelle
5

Das ist nicht wirklich ein Problem mit Rektor oder nicht. Es geht um Schlüsselmanagement. DES und jedes andere Verschlüsselungsschema beruht darauf, dass Schlüssel regelmäßig geändert werden. Ein hartes Codieren des Schlüssels im Code verletzt dies offensichtlich. Um dies zu umgehen, sollten Sie sich die Schlüsselverwaltung ansehen.

BEARBEITEN: Um etwas weiter zu gehen: Abhängig von Ihrer Einrichtung könnten Sie die gehashten Passwörter im Dateisystem speichern und sich auf Dateisystem / Benutzersicherheit oder in einer Datenbank verlassen und auf die Datenbankrechte vertrauen.

    
Brian Rasmussen 16.07.2009 19:47
quelle
4

Sie sollten Ihr Passwort nicht mit einem geheimen Schlüssel verschlüsseln, der in Ihrer Anwendung eingebettet ist. Das ist die Wurzel Ihrer Probleme. Egal wie stark Ihre Verschlüsselung ist, der Schlüssel ist in Ihrem Code deutlich sichtbar.

Sie sollten Ihren Benutzer nach den Anmeldeinformationen fragen, den Benutzer / den Namen und das Kennwort der Datenbank in einem normalen Konfigurationsabschnitt in Ihrer app.config speichern und sich auf die DPAPI-Unterstützung DpapiProtectedConfigurationProvider Klasse, um den Abschnitt für Sie zu verschlüsseln und zu entschlüsseln, entweder mit den Maschinenschlüsseln oder mit einem benutzerspezifischen Schlüssel. Siehe den Link, den ich für ein vollständiges Beispiel zur Verfügung stelle.

    
Remus Rusanu 16.07.2009 20:02
quelle
2

Leider gibt es niemals eine 100% sichere Methode, dies zu tun. Sie können den Code verschleiern, unmanaged Code für geheime Bereiche verwenden, aber da Ihre Anwendung das Passwort erneut lesen kann, kann jeder Angreifer, der sich genügend Mühe gibt, das Passwort lesen.

    
chris166 16.07.2009 19:49
quelle
1

Sie sollten das Passwort nicht verschlüsselt speichern. Sie sollten stattdessen hashed mit einer Einweg-Hash-Funktion speichern. Siehe:

Ссылка

    
Alex319 16.07.2009 19:50
quelle
1

Wir hatten eine ähnliche Situation. Wir haben den Schlüssel schließlich in eine Datei geschrieben und den Benutzer aufgefordert, ein Passwort (oder einen Schlüssel mit Hashing) einzugeben, um die Datei lesen zu können. Es war der Schmerz, dass der Benutzer mehr Informationen eingeben musste, aber es entfernte den Schlüssel aus dem Programm.

    
SwDevMan81 16.07.2009 19:53
quelle

Tags und Links