2011-09-28 4 views
12

Ho la seguente stringa di connessione:Come posso nascondere la mia password nella mia stringa di connessione C#?

Data Source=Paul-HP\MYDB;Initial Catalog=MyMSDBSQL;Persist Security Info=True;User ID=sa;Password=password 

(.net webservice) Questo può ovviamente essere visto semplicemente aprendo il file app.config e guardando le impostazioni di configurazione.

Quello che mi serve è un modo per impedire a un hacker di vedere la password. Ma allo stesso tempo, lasciarlo personalizzabile in modo che possa essere modificato quando distribuito su un altro database.

risposta

13

avete un certo numero di opzioni - quelli che sono a conoscenza di (in ordine di preferenza):

  1. uso integrato di sicurezza (SSPI), dove non è necessario includere una password nella configurazione presentare
  2. crittografare la stringa di connessione (vedi Encrypting Configuration Information Using Protected Configuration)
  3. Conservare il nome utente e la password separatamente e utilizzare la formattazione delle stringhe per costruire la stringa di connessione completa,

Così, per esempio, la stringa di connessione potrebbe essere simile a questo:

Data Source=Paul-HP\MYDB;Initial Catalog=MyMSDBSQL;Persist Security Info=True;User ID={0};Password={1} 

mi piacerebbe andare per l'opzione 1, se questo non è possibile, allora l'opzione 2. Ho l'opzione 3 per completezza detto.

Hai letto Protecting Connection Information (ADO.NET)?

+0

Suggerimento 2 sembra buono per un punto di vista statico, ma nessuna delle soluzioni fornite (da chiunque) consente la personalizzazione della stringa di connessione dopo la compilazione? Sebbene ciò non sia possibile, è necessario che inseriscano testo in chiaro, che è ciò che la codifica sta evitando. P.s perché modifichi tutto ma non apporti modifiche? – Doomsknight

+1

@Doomsknight [Ho appena rimosso la firma "grazie" dalla fine del tuo post] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed- da post) – Justin

+0

Se si desidera personalizzare la stringa di connessione, allora l'opzione 3 potrebbe essere utile - è quindi possibile crittografare la password (e facoltativamente il nome utente) separatamente. – Justin

1

Si potrebbe crittografare la stringa di connessione - poi quando si accede la stringa di connessione, decodificarlo. Questo non è infallibile anche se poi sei bloccato con il problema di dove memorizzare la chiave per decifrare la stringa di connessione!

6

Prima di tutto, non utilizzare l'account "SA". Lascia il tuo database spalancato se qualcuno ottiene la password. Utilizzare un account personalizzato a cui è consentito solo eseguire operazioni CRUD su un database specifico.

L'unico modo per ottenere web.config è hackerare il server. E se lo hanno fatto, sei fregato comunque.

+2

favore indica il motivo giù voti in modo da avere la possibilità di migliorare la mia risposta. – jgauffin

+2

Aspetta ma ... questa risposta in realtà non risponde alla domanda ragazzi! (Non che io abbia downvoted) – Justin

+2

Non ho downvoted la tua risposta, ma ci sono molte altre possibilità per catturare la password dal web.config non solo per hackerare un server, ad esempio alcuni virus possono prenderlo dal computer di sviluppo locale prima della distribuzione o in altri casi. Non importa come ... la domanda è come crittografare la password e ha senso perché la regola principale per quanto riguarda la protezione della password - 'non tenerlo mai in chiaro ' – sll

1

I Suggerisci/decodifica la stringa di connessione. Pertanto la stringa di connessione deve essere impostata manualmente.

Per la crittografia di dare un'occhiata a: http://dotnet-snippets.de/dns/encrypt-and-decrypt-strings-SID205.aspx

Per Impostazioni personalizzate un'occhiata a: http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx

Sostituire il cifrati con quella corretta in fase di esecuzione:

public static void SetAppSettingValue(string Key, string Value) 
    { 

    System.Configuration.Configuration config == ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
// Add an Application Setting. 

config.AppSettings.Settings[Key].Value = Value; 

    // Save the changes in App.config file. 

    config.Save(ConfigurationSaveMode.Modified); 

    ConfigurationManager.RefreshSection("appSettings"); 
    }