2012-03-07 13 views
10

Ho uno scenario che mi ha turbato per anni. Se è necessario connettersi a un database o un altro servizio (come un servizio Web) utilizzando un nome utente e una password, dove sarebbe il posto più sicuro in cui archiviare queste informazioni se ci si connette tramite un assembly .NET? Capisco che dovresti cifrare la password, ma poi ti imbatti in una specie di problema uovo di gallina - bene - puoi cifrarlo, ma poi dove metti la chiave?Dove memorizzare le password db quando si usano le applicazioni Windows .NET o ASP.NET

In .NET, non è possibile codificare la password poiché è possibile decompilare il codice .NET.

Ho esaminato i diritti basati sugli assembly con Isolamento isolato, ma MS consiglia di archiviare gli elementi segreti non crittografati lì perché gli utenti privilegiati possono ottenere l'accesso, quindi, di nuovo, stiamo spostando il problema dal punto A al punto B. Quindi per esempio, un amministratore di dominio senza necessità di conoscere le informazioni in un database sarebbe in grado di ottenere l'accesso a causa della possibilità di essere un amministratore su qualsiasi workstation sul dominio.

È possibile crittografare App.Config e Web.Config, ma credo che gli utenti privilegiati possano accedere alle chiavi.

Penso che tu abbia lo stesso problema con DPAPI.

Avevo pensato di archiviare le password, crittografato in un database remoto e ottenerle tramite l'autenticazione del sistema operativo, ma il nostro reparto vieta l'archiviazione delle password sui server di database. Sono abbastanza sicuro di essere bloccato e volevo una conferma.

+0

So che è un po 'di tempo fa, ma ho fornito una risposta alla tua domanda su come memorizzare le password crittografate. Per favore guarda. – Matt

risposta

9

Non si desidera memorizzare la password nell'assieme e reinventare la rotellina crea solo più problemi (e introduce più vulnerabilità) di quanto valga. Se si utilizza la piattaforma MS sia sul database che sul server Web, il modo più semplice per gestirlo è use a trusted connection e concedere i diritti sul server SQL all'identità utilizzata dall'applicazione.

In secondo luogo, vorrei solo let DPAPI do its job to encrypt your connection settings.

+0

Il problema principale a cui mi sono imbattuto è che sia l'app Web che quella Windows con cui lavoro funzionano dove non ho la possibilità di utilizzare l'autenticazione del sistema operativo. L'app di Windows, in particolare, si trova su una casella multiutente: per quanto ne so dai documenti, dovrei configurare impostazioni separate per ciascun utente se utilizzo DPAPI in modalità utente. Se utilizzo DPAPI in modalità macchina, le mie informazioni di connessione saranno disponibili per tutte le app che utilizzano DPAPI. Sfortunatamente, devo anche usare i fornitori conformi FIPS 140, che ritengo sia conforme alle regole DPAPI e RSA. Penso che il modo migliore per farlo sia ottenere la password dalla scatola. –

+0

Ooops. DPAPI ha utilizzato TripleDES, che credo sia FIPS.Ciò non aiuta ancora nell'area di accesso multiutente in cui in modalità macchina tutte le app che utilizzano DPAPI (come ho capito) hanno accesso alle stesse informazioni –

+0

È possibile crittografare le sezioni di configurazione utilizzando il DPAPI del negozio utente. Ho aggiornato la mia risposta con un collegamento con le istruzioni. Si noti che le istruzioni mancano di indicazioni sulla configurazione del pool di applicazioni (se si utilizza IIS7 +) per caricare il profilo utente dell'identità. Penso che sarà necessario attivare questo flag, poiché l'archivio utente DPAPI richiede il caricamento del profilo. – HackedByChinese

0

Ci sono un paio di opzioni qui.

  1. memorizzarli nel file di configurazione criptato
  2. memorizzarli in un file esterno che è criptato con un seme generato. Obfuscate il codice che memorizza questo seme di base o lo memorizza in una DLL C++ (difficile da decompilare).
1

Questa è una buona domanda e ho cercato una risposta da solo. Il problema che ho avuto è stato quello di mantenere sicure le password db nel caso in cui il server fosse stato violato e si potessero recuperare i singoli file. Un'opzione molto interessante che ho trovato è che le sezioni di web.config possono essere crittografate e decrittografate automaticamente al volo da .NET framework che usa l'archivio sicuro di Windows per conservare e recuperare la chiave di crittografia. Nella mia situazione non era disponibile perché il mio provider di hosting non lo supportava, ma potresti dare un'occhiata a questa opzione. Perché penso che possa funzionare è che puoi gestire in modo indipendente la sicurezza di ciò che gli utenti possono accedere all'archivio protetto di Windows e limitare significativamente qualsiasi potenziale violazione. Un hacker che si intromette nel server potrebbe ottenere una copia dei tuoi file di configurazione e di tutti i tuoi assembly, ma l'accesso alla chiave di decifrazione sarebbe un altro ostacolo per lui.

3

È possibile utilizzare i seguenti metodi della .NET Framework per proteggere i dati, usano il DPAPI internamente per proteggere i dati, ed è possibile utilizzare direttamente in C# o VB.NET senza dover smanettare con le chiamate DLL di sistema:

namespace System.Security.Cryptography 
{ 
    // Summary: 
    //  Provides methods for protecting and unprotecting data. This class cannot 
    //  be inherited. 
    public sealed class ProtectedData 
    { 
     public static byte[] Protect(byte[] userData, 
      byte[] optionalEntropy, DataProtectionScope scope); 
     public static byte[] Unprotect(byte[] encryptedData, 
      byte[] optionalEntropy, DataProtectionScope scope); 
    } 
} 

Per usarlo, aggiungere il riferimento System.Security al progetto. Consiglio vivamente di utilizzare l'array di byte optionalEntropy per aggiungere un SALT ai dati protetti (aggiungere alcuni valori casuali all'array di byte che sono univoci per i dati che si intende proteggere).

Per scope è possibile utilizzare DataProtectionScope.CurrentUser, che crittograferà i dati per proteggere con le credenziali dell'utente corrente.

In alcuni scenari, anche DataProtectionScope.LocalMachine è utile. In questo caso, i dati protetti sono associati al contesto della macchina. Con questa impostazione qualsiasi processo in esecuzione sul computer può rimuovere la protezione dei dati. Viene solitamente utilizzato in applicazioni specifiche del server che vengono eseguite su un server a cui gli utenti non autorizzati non possono accedere.

Utilizzare il metodo Protect per crittografare i dati, decrittografarlo con Unprotect. È possibile memorizzare l'array di byte restituito in base ai requisiti dell'applicazione (file, database, registro, ecc.).

più su questi metodi possono essere trovati qui a MSDN:

Per i campioni di codice e nel caso siete interessati a criptare parti delle applicazioni di file .config, check this out:

vi consiglio di usare un SALE (es usando il parametro optionalEntropy) - protegge contro gli attacchi della tabella arcobaleno.


C'è uno svantaggio della soluzione DPAPI vorrei citare: La chiave è generato in base alle tue credenziali di Windows, il che significa chi ha accesso alle proprie credenziali Windows ha probabilmente l'accesso ai dati protetti. Un programma in esecuzione con il tuo account può accedere anche ai dati protetti.

Problemi correlati