Sto scrivendo un progetto per archiviare e condividere in modo sicuro le password tra gli utenti, ho fatto un sacco di ricerche sugli algoritmi di crittografia, CSPRNG, algoritmi di hashing, stretching chiave ecc ...
Voglio solo delineare il mio modo di pensare su come usare tutti questi, per creare l'applicazione sicura - e spero che qualcuno (o i) possa puntare i nostri difetti o dirigermi se vedo cose sbagliate:
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'implementazione di questi in "CryptSharp" (si spera che questa sia un'implementazione sicura) - anche dopo ulteriori ricerche ( link ) sembra che lo scrypt sia un modo più sicuro per creare un hash.
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 questo sia archiviato 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 archiviare questa stringa concatenata di IV e Keys, quindi dopo alcune ricerche mi sono imbattuto nell'API di protezione dati di Microsoft (ProtectedMemory.Protect (secret, MemoryProtectionScope.SameLogon)) - la mia comprensione di questo è che il Pool di app 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).
Pensieri?
Quindi, queste sono le mie idee per creare un sistema di archiviazione dati sicuro; sto guardando qualcosa? ho frainteso qualcosa? dovrei fare qualcosa di più?
Apprezzo qualsiasi consiglio su questo.