2009-07-31 21 views
8

Ho un po 'di codice che deve essere eseguito con privilegi elevati (più che voglio che il resto del mio codice sia in esecuzione).Modi per inserire una password nel codice

Ho il mio codice che imposta la rappresentazione al funzionamento, ma richiede un nome utente, un dominio e una password. Siccome il mio codice è in C# .net, so che la password può essere trovata da chiunque sia sufficientemente determinata.

C'è un modo per crittografare la password nel mio codice? O altrimenti proteggere questa password ed essere ancora in grado di passarla?

Ecco il codice che io chiamo:

using (new Impersonator("UserNameGoesHere", "DomainNameGoesGere", "Password Goes Here")) 
{ 
    uint output; 
    NetUserAdd(AUTHENTICATION_SERVER, 1, ref userinfo, out output); 
    return output; 
} 

mi piacerebbe un esempio che mostra come risolvere questo problema per non mostrare la mia password in testo normale.

Sto usando Visual Studio 2008, .NET 3.5 SP1, e in esecuzione su Windows Server 2003.

+0

Grazie per tutte le grandi risposte! Ho intenzione di provarli e scegliere quello che funziona meglio. Grazie ancora! – Vaccano

risposta

4

Vaccano,

Suggerirei indagare il Data Protection API (DPAPI) per quello che stai cercando di raggiungere. È considerato parte della soluzione in molti approcci di best practice per archiviare in modo reversibile le password necessarie per le applicazioni.

Un buon articolo che discute la DPAPI (e altre tecniche + riguarda) può essere trovato qui:

http://msdn.microsoft.com/en-us/magazine/cc164054.aspx

Con C# 2.0, P/Invoking non è richiesto nemmeno; wrapper gestite esistono:

http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=41ca5a99-ddc0-4d0a-9919-2ce10bf50c7e

Spero che questo aiuta!

+1

Jon Galloway ha alcuni esempi di implementazione di questo ... http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx – MyItchyChin

4

Si dispone di più opzioni qui.

  1. È possibile cancellare la password per la prima volta e memorizzare l'hash in un file. Ora la prossima volta, si desidera eseguire il codice con privilegi elevati, è necessario accettare/ridigitare la password e ricalcolare l'hash e associarlo con l'hash memorizzato. Solo se corrisponde, eseguirai il tuo codice in modalità di elevazione. Potresti usare hash usando SHA. Si prega di guardare lo spazio dei nomi System.Crytography per esempi su hashing.

  2. La seconda opzione consiste nel crittografare la password utilizzando algoritmi come AES. Tuttavia è necessario avere una chiave per farlo e dovrai preoccuparti di proteggere questa chiave.

  3. Terza opzione è utilizzare DPAPI e crittografare la password ma non preoccuparsi di proteggere le chiavi: opzione molto più semplice di 2.

Vorrei raccomandare 1 se non vi dispiace reinserire la password ogni volta che si avvia l'applicazione. Se questa non è una possibilità, suggerirei di andare con 3 e usare DPAPI.

Ecco alcuni link per iniziare.

1. http://www.obviex.com/samples/dpapi.aspx 2. http://www.obviex.com/samples/Encryption.aspx

+0

Il suggerimento di hash la password non riesce a prendere l'arcobaleno attacco da tavolo in considerazione. La password deve essere "salata" prima di essere sottoposta a hash. Vedi http://www.codinghorror.com/blog/archives/000949.html –

2

È possibile utilizzare safe-config package NuGet. Internamente utilizza l'API di protezione dei dati per crittografare e decrittografare i dati.

//Save some configuration data at folder data\temp\ 
var configManager = new ConfigManager() 
    .WithOptions(DataProtectionScope.CurrentUser) 
    .Set("password", "my-massword") 
    .AtFolder(@"data\temp\") 
    .Save(); 

    ... 

//Load configuration data 
var loadedValue = new ConfigManager() 
    .AtFolder(@"data\temp\") 
    .Load() 
    .Get<string>("password"); 
Problemi correlati