2010-06-14 20 views
10

La mia applicazione utilizza la classe RijndaelManaged per crittografare i dati. Come parte di questa crittografia, utilizzo un oggetto SecureString caricato con una password che viene convertito in una matrice di byte e caricato nella chiave dell'oggetto di RajindaelManaged in fase di runtime.Memorizzare in modo sicuro una password nel codice del programma?

La domanda che ho è la memorizzazione di questo SecureString. Una password immessa dall'utente può essere immessa in fase di esecuzione e può essere caricata "in sicurezza" in un oggetto SecureString, ma se non viene specificata alcuna password inserita dall'utente, è necessario eseguire l'impostazione predefinita su qualcosa.

Quindi in ultima analisi, il quesiton si riduce a:

Se devo avere alcuni noti stringa o array di byte da caricare in un oggetto SecureString ogni volta le mie corse di applicazione, come posso fare questo? I dati "crittografati" alla fine vengono decrittografati da un'altra applicazione, quindi anche se non viene specificata alcuna password inserita dall'utente, ho ancora bisogno che i dati vengano crittografati mentre passano da un'app all'altra. Ciò significa che non posso avere la password predefinita in ordine casuale, perché l'altra app non sarebbe in grado di decrittografarla correttamente.

Una possibile soluzione che sto pensando è quello di creare una dll che sputa solo una singola password, allora io uso che passphrase ed eseguirlo tramite un paio di diversi hashing/funzioni di riorganizzazione in fase di esecuzione prima che in ultima analisi, inserirlo nell'apparecchio oggetto secureString. Questo sarebbe abbastanza sicuro?

Modifica Per chiarezza *: I dati crittografati vengono passati tramite file tra macchine. Consideralo come un file Zip che ha sempre una password, si presume un valore predefinito se nulla viene inserito direttamente dall'utente.

risposta

8

Non è necessario crittografare simmetricamente una stringa codificata nel file eseguibile. Darà solo un falso senso di sicurezza. Nessuna quantità di hashing risolve questo schema.

Vedere this Pidgin FAQ per lo stesso punto in un contesto diverso.

Non sono chiaro perché pensi che sia necessario crittografare la comunicazione tra le app. Se questa comunicazione è locale alla macchina, quindi non vedo la necessità di crittografia, in particolare la crittografia che non è specifica dell'utente. È uno schema DRM?

MODIFICA: se viene passato a una macchina diversa, è possibile codificare un codice public key e quindi decodificare l'altro computer con la chiave privata corrispondente.

+0

Ho letto la domanda come in arrivo con un'alternativa alla codifica hard della stringa in primo luogo. – Serapth

+0

Non è locale alla macchina, i dati crittografati finiscono in xml, che viene poi trasferito su una macchina diversa (non è tuttavia possibile una connessione diretta). – Nick

+0

+1 Sono totalmente d'accordo con Pidgin. – rook

2

Questo articolo su securing SQL connection strings dovrebbe essere altrettanto valido per la memorizzazione di password crittografate, in cui si consente al sistema operativo di gestire la crittografia del seme salante per la decrittografia.

6

Lasciatemi affrontare prima la tua domanda finale.

"Questo sarebbe abbastanza sicuro?"

L'unico che può rispondere che sei tu. Nessuno qui sa cosa significa "abbastanza sicuro" nel contesto della vostra applicazione.

State costruendo un'applicazione per tenere il diario delle ragazze adolescenti? Certo, sarebbe "abbastanza sicuro".

State costruendo un'applicazione per crittografare informazioni o autenticazione per sistemi sicuri di livello militare? No, nemmeno vicino.

È possibile fare affidamento su un solo tipo di protezione se si intende memorizzare la password nel codice sorgente e quindi nell'eseguibile, ovvero di sicurezza dall'oscurità.

Se il tuo problema è che non puoi, o non vuoi, memorizzare la password nel codice sorgente, quindi spostarlo in una dll separata non risolve nulla, hai appena spostato il problema in un altro progetto.

Tuttavia, mi sto chiedendo qualcosa. Dici "Devo fare il default su qualcosa". È così? Stai cercando di memorizzare un valore predefinito per la stringa della password sicura nel codice sorgente? Che ne dici di "THISISNOTAPASSWORD"?

+6

Anche i cyber-criminali sono ben lungi dall'essere ingannati da THISISNOTAPASSWORD. Invece ti suggerisco di impiegare psicologia e andare con THISISAPASSWORD. – Serapth

+0

Se mi è stato assegnato questo problema di hacking, sarò davvero confuso con questo gioco psicologico. : P – Fraga

+0

+1 per il controllo per vedere cosa è "abbastanza sicuro". –

2

Mi sembra che forse dovresti utilizzare una soluzione PKI anziché crittografia/decrittografia. Se si dispone di un'altra applicazione che deve utilizzare i dati crittografati, è possibile disporre di una coppia di chiavi per tale applicazione e fornire la chiave pubblica all'app che esegue la crittografia. In questo modo stai mantenendo i tuoi dati al sicuro, ma non introducendo una serie di codice aggiuntivo che alla fine non offre tutta questa protezione.

Una rapida ricerca google mi ha dato this articolo Codice progetto che parla utilizzando il certificati di Windows nel Net

6

Eric Lippert You Want Salt With That? (original blog post)

Anche leggere il suo post per Use the right tool for the job dove si conclude con la seguenti suggerimenti:

0) Se possibile, semplicemente non andare lì. La crittografia è estremamente difficile da ottenere ed è spesso la soluzione sbagliata in primo luogo. Usa altre tecniche per risolvere i tuoi problemi di sicurezza.

1) Se il problema è un client inaffidabile, non creare una soluzione di sicurezza che richieda la fiducia del client.

2) Se è possibile utilizzare parti pronte per l'uso, farlo.

3) Se non è possibile utilizzare parti preconfezionate e devono utilizzare un crittosistema, non utilizzare un crittosistema che non si è completamente compreso.

4) Se si utilizza un sistema crittografico che non si comprende completamente, almeno non utilizzarlo per risolvere problemi che non è stato progettato per risolvere.

5) Se si deve usare un sistema di crittografia per sciare tra gli alberi, almeno non consentire al client presumibilmente ostile di scegliere il messaggio che è crittografato. Scegli tu stesso il token. Se il token deve includere informazioni dal client, quindi disinfettarlo in qualche modo; richiede che sia solo testo ASCII semplice, inserire spazi vuoti casuali e così via.

6) Se è necessario consentire al client di scegliere il token, non crittografare il token stesso. Firma un hash crittograficamente sicuro del token. È molto più difficile per l'attaccante scegliere un gettone che produce un hash desiderato.

7) Non utilizzare la stessa coppia di chiavi per crittografare i messaggi in uscita come si fa per proteggere i messaggi in arrivo. Ottieni una coppia di chiavi per ciascuna operazione logicamente diversa che stai per eseguire.

8) Criptare le comunicazioni in entrambe le direzioni.

9) Considera di avere un meccanismo di revoca, in modo che una volta che sai che Eve ti sta attaccando, puoi almeno revocare la sua licenza. (Oppure è possibile revocare una licenza compromessa con un noto e così via.)

Problemi correlati