Consigli sull'utilizzo della crittografia e dell'hash

0

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:

  1. All'installazione del sistema, il sistema utilizzerà RNGCryptoServiceProvider per creare 3 chiavi di crittografia e 3 IV.
  2. 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).
  3. Questa stringa verrà quindi crittografata utilizzando l'API di Data Protection e memorizzata in un file di impostazioni.

  4. 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:

  1. I 3 tasti e decrittografati con DPAPI
  2. 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.

    
posta binks 04.07.2014 - 13:57
fonte

1 risposta

-1

Questo post potrebbe essere downvote ma trovo la tua vera domanda interessante. Quale considero essere:

How to share password between user of your service on Internet?

Iniziamo con alcune ipotesi

Architettura del tuo servizio

  • Ogni utente ha un account protetto da una password principale conosciuta solo da solo
  • Ogni utente ha una serie di password crittografate associate al proprio account
  • La password principale deve essere sottoposta a hash prima di memorizzarla nel database.

Ora dobbiamo essere in grado di condividere in modo sicuro queste password crittografate.

Esiste un sito web che fa qualcosa di simile: LastPass .

Una cosa da notare su LastPass è che tutta la loro crittografia viene eseguita su dalla parte del cliente. LastPass usa la tua password principale, la password che usi per accedere al tuo account, per crittografare tutta la tua altra password sul lato client, la tua macchina.

Questo ha il vantaggio che la tua password principale non lascia mai la tua macchina e quindi, a meno che il tuo computer non sia compromesso da un virus, è impossibile per chiunque altro che decifrare le altre password. Nemmeno amministratori di LastPass. Quindi le tue password sono nella nuvola ma è come se fossero nella tua testa.

LastPass è anche in grado di condividere la password tra gli utenti. Non so come lo fanno, ma prenderò una supposizione a caso ...

Utilizzo della chiave pubblica / privata

La crittografia asimmetrica è la chiave qui. Puoi facilmente aggiungere una chiave pubblica e una chiave privata all'account. La chiave pubblica deve essere in testo normale in modo che altri siano in grado di usarla. Tuttavia, la chiave privata deve essere crittografata con la password principale sul lato client, come tutte le altre password, prima di essere archiviata sul server.

Ora, se qualcuno vuole condividere una password con te, ha solo bisogno di richiedere la tua chiave pubblica usando il tuo nome account (o un altro alias), poi cripta una sua password con la tua chiave pubblica e la invia al sito web che la aggiungerà al tuo account.

Quando accedi, vedrai che hai ricevuto una nuova password. Puoi quindi decodificarlo sul lato client usando la tua chiave privata, reencrypt usando la tua chiave master e salvala sul server.

    
risposta data 04.07.2014 - 15:34
fonte

Leggi altre domande sui tag