Domanda

Ho del codice come questo in un'app Winforms che stavo scrivendo per interrogare la quota di archiviazione della casella di posta di un utente.

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

Non importa quale approccio ho provato (come SecureString), riesco facilmente a vedere la password (m_pwd) utilizzando Reflector o utilizzando la scheda stringhe di Process Explorer per l'eseguibile.

So che potrei inserire questo codice sul server o rafforzare la sicurezza utilizzando meccanismi come la delega e concedendo solo i privilegi richiesti all'account di servizio.

Qualcuno può suggerire un modo ragionevolmente sicuro per memorizzare la password nell'applicazione locale senza rivelarla agli hacker?

L'hashing non è possibile poiché è necessario conoscere la password esatta (non solo l'hash per la corrispondenza).I meccanismi di crittografia/decrittografia non funzionano poiché dipendono dalla macchina.

È stato utile?

Soluzione

Il metodo santificato consiste nell'utilizzare CryptoAPI e le API di protezione dei dati.

Per crittografare, utilizzare qualcosa del genere (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;

La decrittazione è l'opposto:

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));

Se non specifichi CRYPTPROTECT_LOCAL_MACHINE, la password crittografata può essere archiviata in modo sicuro nel registro o nel file di configurazione e solo tu puoi decrittografarla.Se specifichi LOCAL_MACHINE, chiunque abbia accesso alla macchina potrà ottenerlo.

Altri suggerimenti

Come accennato, l’API Data Protection è un buon modo per farlo.Tieni presente che se usi .NET 2.0 o versione successiva, non è necessario usare P/Invoke per richiamare DPAPI.Il framework racchiude le chiamate con la classe System.Security.Cryptography.ProtectedData.

Ho trovato questo libro di Keith Brown La guida per sviluppatori .NET alla sicurezza di Windows.Contiene alcuni buoni esempi che coprono tutti i tipi di scenari di sicurezza.Gratuito Versione in linea è anche disponibile.

Se la memorizzi come stringa protetta e salvi la stringa protetta in un file (possibilmente utilizzando Archiviazione isolata, l'unica volta che avrai una password in testo semplice sarà quando la decodificherai per creare il tuo mbstore.Sfortunatamente, il costruttore non accetta un oggetto SecureString o Credential.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top