La crittografia non è un tuo problema in quanto molti esempi di crittografia C # faranno la cosa giusta con la classe CryptoStream
. Ma dopo aver consultato rapidamente l'articolo CodeProject che hai collegato , posso di 'con certezza che è meglio che non usi il codice come presentato. Elencherò i problemi nell'ordine in cui appaiono nel codice.
-
private void EncryptFile(string inputFile, string outputFile)
Il metodo di crittografia richiede un nome del percorso . Ciò significa che i file si troveranno sul tuo file system in un modulo vulnerabile non crittografato finché non verrà crittografato con questo metodo e eliminato. Dovrebbe essere crittografato nella memoria del server mentre viene tirato attraverso la connessione prima di toccare qualsiasi dispositivo di archiviazione!
-
string password = @"myKey123"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
Che diavolo? La password dovrebbe mai essere usata direttamente dalla stringa grezza! Dovrebbe essere sottoposto a hash con qualcosa di sicuro!
-
CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write);
Perché è il vettore di inizializzazione uguale alla chiave? C'è un metodo per questo: RijndaelManaged.GenerateIV();
-
catch { MessageBox.Show("Encryption failed!", "Error"); }
Se lo stai eseguendo su un server senza un'interfaccia utente, questo causerà problemi. Ma il problema più grande è che questo blocco catch non è abbastanza specifico per determinare come gestire il problema! Vedi Best practice per la gestione delle eccezioni in Java o C # .
A parte questo, il altro potenziale punto debole è il modo in cui generi le chiavi, dove le mantieni e come viene controllato l'accesso ai tasti.
Nel tuo caso, chi detiene le chiavi del testo cifrato: tu o il cliente o entrambi? Se possiedi anche le chiavi, dovrai capire come un utente malintenzionato che ha violato il tuo server e ottenere il tuo testo cifrato non avrà le tue chiavi.
La soluzione migliore è archiviare i dati crittografati sul server con la chiave crittografata. La chiave stessa deve essere crittografata utilizzando le credenziali dell'utente. In questo modo, il server può solo decodificare i dati e inviarli all'utente quando l'utente esegue il login e decrittografa la chiave con la password e il server può crittografare e decrittografare i dati con la chiave decrittografata fino a quando l'utente non si disconnette, a quel punto la chiave dovrebbe essere cancellata dalla memoria. Se hai implementato questo sistema e i tuoi dati sono stati rubati, l'utente malintenzionato avrebbe un set di chiavi crittografate (che sono inutili fino alla decrittazione con la password dei clienti) e blob di dati crittografati (che sono anche inutili senza le chiavi di decrittografia).