2015-08-10 11 views
5

Sto lavorando su un'applicazione che è stata eseguita su diversi server. Uno dei server gestisce l'input e gli altri lo eseguono. Come per la politica aziendale, tutto deve passare attraverso il database e i socket tra le istanze non sono consentiti.Passaggio password attraverso il database come renderlo sicuro

Ora questo funziona bene per tutto, ma una cosa che mi preoccupa è la password. Attualmente sto implementando qualcosa che richiede una password utente per arrivare a una di queste applicazioni in formato testo. Ora capisco che questo non sarà mai sicuro al 100%, ma come faccio a minimizzare il rischio? Attualmente ho in programma di mettere il pw nel database e cancellarlo dal db una volta arrivato. I log vengono cancellati una volta al giorno. Come posso migliorare questa sicurezza?

+0

renderlo crittografato e utilizzare hash e sale – kulotskie

risposta

5

È possibile utilizzare questo metodo per crittografare la password:

 public string Encrypt(string stringToEncrypt, string SEncryptionKey) 
     { 
       key = System.Text.Encoding.UTF8.GetBytes(SEncryptionKey); 
       DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
       byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt); 
       MemoryStream ms = new MemoryStream(); 
       CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write); 
       cs.Write(inputByteArray, 0, inputByteArray.Length); 
       cs.FlushFinalBlock(); 
       return Convert.ToBase64String(ms.ToArray());    
     } 

utilizzando:

private byte[] key = { }; 
    private byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }; 

E poi è possibile inserire nel database

password = ... 
password = Encrypt(password.Trim(), "r0b1nr0y"); 

// Insert in db 

e per la decrittazione, è può utilizzare questo metodo:

public string Decrypt(string stringToDecrypt, string sEncryptionKey) 
{ 
     byte[] inputByteArray = new byte[stringToDecrypt.Length + 1]; 
     key = System.Text.Encoding.UTF8.GetBytes(sEncryptionKey); 
     DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
     inputByteArray = Convert.FromBase64String(stringToDecrypt); 
     MemoryStream ms = new MemoryStream(); 
     CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write); 
     cs.Write(inputByteArray, 0, inputByteArray.Length); 
     cs.FlushFinalBlock(); 
     System.Text.Encoding encoding = System.Text.Encoding.UTF8; 
     return encoding.GetString(ms.ToArray()); 
} 
+0

Cos'è IV? E perché rilevare un errore e quindi restituire il messaggio di errore come una crittografia? Sembra una cosa rischiosa da fare. – Thijser

+0

E come lo avrei decodificato di nuovo? – Thijser

+0

IV è il vettore di inizializzazione e questo metodo è sicuro –

0

È possibile utilizzare HASHBYTES() che restituisce l'hash dell'input fornito, nel proprio caso password.

SELECT HashBytes('SHA1', password_field); 

Invece di passare la password come testo normale, passare questo valore di hash al server; che è molto più sicuro.

+0

Hashing non funzionerà come il pw deve arive in testo normale. – Thijser

1

Se non è possibile hash la password, poiché è necessaria la password come testo normale (cosa sto indovinando della tua domanda), quindi è possibile memorizzare la password crittografata nella colonna. Tutte le applicazioni sui diversi server devono condividere la chiave di decrittografia all'interno della configurazione.

A proposito: utilizzerei anche la connessione SQL crittografata per proteggermi dallo sniffing.

+0

Come suggeriresti di crittografare la password? C'è una buona funzione C# per quello? – Thijser

Problemi correlati