Riformulerò una domanda che ho chiesto prima, perché non penso che nessuno abbia capito cosa intendevo.
Bazzialmente sto scrivendo un armadietto delle password basato sul web, che può avere più account; in modo che gli utenti possano condividere le password (utile se ti trovi in una società di un sito web e devi condividere i dettagli di accesso per dire "1 & 1" o "Fasthosts" ecc ...).
Ho fatto un sacco di ricerche su algoritmi di crittografia, CSPRNG, algoritmi di hashing, stretching chiave ecc ...
Non voglio implementare i miei algoritmi di crittografia o hashing (perché questo è un grande no-no!), invece, voglio usare gli algoritmi esistenti e applicarli in un modo che ho capito dalla mia ricerca.
Non sono un criptogropher, quindi potrei aver capito qualcosa in modo errato, o qualcosa di cui ho letto è stato scoperto essere insicuro o è un vecchio modo di fare le cose e qualcosa di meglio è arrivato. Quindi mi piacerebbe discutere di quali sono i pensieri sull'implementazione:
Hashing for storing the passwords of user accounts. and;
Encryption for storing the login details of websites that users can share.
di hashing
Quindi, prima di tutto, ho bisogno di memorizzare hash delle password degli account (questi sono gli account che accedono all'applicazione per visualizzare le password condivise).
Dopo aver letto in giro, la mia comprensione è che per rendere un hash "più sicuro", è necessario usare scrypt o bcrypt o pbkdv2. Ho trovato un implantation di questi 3 alrogitmi in "CryptSharp" (si spera che questa sia un'implementazione sicura di questi algoritmi) - anche dopo ulteriori ricerche ( link ) sembra che sCrypt sia un modo più sicuro per creare un hash.
Lo scrypt è un modo sicuro per creare un hash della password di un utente o dovrei usare uno degli altri due (ad esempio forse sCrypt non è stato provato come testato come gli altri due)? Come posso sapere se l'implementazione di sCrypt in "CryptSharp" è una buona implementazione sicura?
Codifica
Poiché i dati saranno condivisi tra gli utenti, dovrò accertarmi che il sistema utilizzi una chiave di crittografia master per l'intero progetto e che sia conservata in modo sicuro.
Il mio pensiero qui è generare una chiave di crittografia e un vettore di inizializzazione (3 di loro - spiegherò perché) - questi saranno generati con RNGCryptoServiceProvider e tutti e 3 saranno concatenati in Key1 | IV1 | Key2 | IV2 | Key3 | IV3 in modo che possano essere divisi e utilizzati con gli algoritmi di crittografia.
Ho bisogno di un modo per memorizzare questa stringa concatenata di IV e chiavi, quindi dopo alcune ricerche mi sono imbattuto nell'API di protezione dei dati di Microsoft (ProtectedMemory.Protect (secret, MemoryProtectionScope.SameLogon)) - la mia comprensione di questo è che l'app Il pool dovrà essere eseguito con un account utente e "load profile" impostato su true. La stringa crittografata risultante verrà quindi memorizzata in un file di impostazioni XML.
Riguardo alla crittografia delle password da condividere, ho letto sulla "crittografia a cascata" (usata in TrueCrypt). Gli algoritmi di crittografia utilizzati da TrueCrypt sono; AES, TwoFish e Serpent. Ho trovato un'implementazione di questi ( link - che, ancora una volta, spero sia un'implementazione sicura). Questo è dove saranno usati i 3 IV e le Chiavi; così efficacemente i dati saranno crittografati in questo modo: Serpent (TwoFish (AES (data, key1), key2), key3).
Quindi, per essere chiari su questo; questo è il flusso di processo della crittografia all'interno del sistema:
- All'installazione del sistema, il sistema utilizzerà RNGCryptoServiceProvider per creare 3 chiavi di crittografia e 3 IV.
- Queste 3 chiavi e IV saranno concimate in una singola stringa: Key1 | IV1 | Key2 | IV2 | Key3 | IV3 (quindi posso dividerle e usarle nei 3 algoritmi di crittografia).
-
Questa stringa verrà quindi crittografata utilizzando l'API di Data Protection e memorizzata in un file di impostazioni.
-
Tutti i dettagli di accesso condivisi sono crittografati usando "crittografia a cascata" di: Serpent (TwoFish (AES (data, key1), key2), key3) - le 3 chiavi e le IV saranno decodificate al volo, invece di essere memorizzati in memoria.
Quando è il momento di decodificare i dettagli di accesso condiviso:
- I 3 tasti e decrittografati con DPAPI
- La crittografia è invertita: AES (TwoFish (Serpent (data, key3), key2), key1);
La "crittografia a cascata" è ancora una buona idea? L'API di Data Protection è un buon modo per crittografare le chiavi e i IV?
Quindi, come ho detto, so come costruire l'intero sistema e implementare la mia comprensione dell'hashing e della crittografia di cui sopra nel sistema ... ma è quello che ho discusso sul modo giusto di fare le cose? Sto guardando qualcosa? Ho frainteso qualcosa? Sto usando un vecchio modo di fare le cose?
Apprezzerei qualsiasi consiglio. Molte grazie.