Frage

Ich habe einen solchen Code in einer Winforms-App, die ich geschrieben habe, um das Speicherkontingent des Postfachs eines Benutzers abzufragen.

DirectoryEntry mbstore = new DirectoryEntry(
      @"LDAP://" + strhome, 
      m_serviceaccount, 
      [m_pwd], 
      AuthenticationTypes.Secure);

Egal welchen Ansatz ich ausprobiert habe (z.B SecureString), kann ich das Passwort leicht sehen (m_pwd) entweder mit Reflector oder mit der Registerkarte „Strings“ des Prozess-Explorers für die ausführbare Datei.

Ich weiß, dass ich diesen Code auf dem Server ablegen oder die Sicherheit erhöhen könnte, indem ich Mechanismen wie Delegierung verwende und dem Dienstkonto nur die erforderlichen Berechtigungen erteile.

Kann jemand eine einigermaßen sichere Möglichkeit vorschlagen, das Passwort in der lokalen Anwendung zu speichern, ohne es Hackern preiszugeben?

Hashing ist nicht möglich, da ich das genaue Passwort kennen muss (nicht nur den Hash zum Zweck des Abgleichs).Verschlüsselungs-/Entschlüsselungsmechanismen funktionieren nicht, da sie maschinenabhängig sind.

War es hilfreich?

Lösung

Die heilige Methode besteht darin, CryptoAPI und die Datenschutz-APIs zu verwenden.

Verwenden Sie zum Verschlüsseln etwa Folgendes (C++):

DATA_BLOB blobIn, blobOut;
blobIn.pbData=(BYTE*)data;
blobIn.cbData=wcslen(data)*sizeof(WCHAR);

CryptProtectData(&blobIn, description, NULL, NULL, NULL, CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &blobOut);
_encrypted=blobOut.pbData;
_length=blobOut.cbData;

Die Entschlüsselung ist das Gegenteil:

DATA_BLOB blobIn, blobOut;
blobIn.pbData=const_cast<BYTE*>(data);
blobIn.cbData=length;

CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut);

std::wstring _decrypted;
_decrypted.assign((LPCWSTR)blobOut.pbData,(LPCWSTR)blobOut.pbData+blobOut.cbData/sizeof(WCHAR));

Wenn Sie CRYPTPROTECT_LOCAL_MACHINE nicht angeben, kann das verschlüsselte Passwort sicher in der Registrierungs- oder Konfigurationsdatei gespeichert werden und nur Sie können es entschlüsseln.Wenn Sie LOCAL_MACHINE angeben, kann jeder, der Zugriff auf die Maschine hat, darauf zugreifen.

Andere Tipps

Wie bereits erwähnt, ist die Datenschutz-API hierfür eine gute Möglichkeit.Beachten Sie, dass Sie bei Verwendung von .NET 2.0 oder höher nicht P/Invoke verwenden müssen, um die DPAPI aufzurufen.Das Framework umschließt die Aufrufe mit der Klasse System.Security.Cryptography.ProtectedData.

Ich habe dieses Buch von Keith Brown gefunden: The .NET Developer's Guide to Windows Security.Es enthält einige gute Beispiele, die alle Arten von Sicherheitsszenarien abdecken.Frei Online Version ist auch vorhanden.

Wenn Sie es als sichere Zeichenfolge speichern und die sichere Zeichenfolge in einer Datei speichern (möglicherweise mit Isolierter Speicher, ein Nur-Text-Passwort erhalten Sie nur dann, wenn Sie es entschlüsseln, um Ihren MBstore zu erstellen.Leider akzeptiert der Konstruktor kein SecureString- oder Credential-Objekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top