Password secondaria memorizzata in modo sicuro

0

Attualmente sto scrivendo un sito portale per Microsoft Dynamic CRM, il portale funziona così:

  • Ogni utente ha il proprio account per accedere al mio portale.
  • Ad ogni utente viene assegnata una credenziale CRM separata da admin. Attualmente, sia il nome utente che la password per il sito CRM sono memorizzati come testo in chiaro (la password per il portale stesso è correttamente hash, salata, ... utilizzando AspNet Identity Core).
  • Dopo aver effettuato l'accesso al mio portale, gli utenti verranno autenticati con il sito CRM in background e potranno iniziare a visualizzare, aggiungere, modificare ed eliminare record sul sito CRM.
  • Gli utenti possono modificare la propria password del portale, ma le credenziali CRM sono fisse e possono essere modificate solo dall'amministratore.

Ovviamente non vorrei archiviare credenziali CRM in testo semplice, ma non riesco a trovare alcuna soluzione funzionante per il mio problema. Ho preso in considerazione le seguenti scelte:

  1. Hash password CRM e archivia l'hash. Questo non funziona perché ho bisogno della password originale per l'autenticazione con il sito CRM.

  2. È stata derivata una chiave dalla password dell'utente e crittografata la password CRM, quindi archiviata la password crittografata (stile gestore password). Non funziona perché admin non sarà in grado di cambiare la password CRM.

  3. Come 2, ma usa la password dell'amministratore per ricavare la chiave di crittografia. Anche questo non funziona perché non posso più autenticare gli utenti con il sito CRM.

posta tsukumogami 01.06.2016 - 07:09
fonte

1 risposta

1

Le password sono dati dell'utente. Se si dispone di una "password" che non è né impostata né utilizzata da un utente, viene chiamata "chiave" o "segreta" (la terminologia esatta varia a seconda dell'utilizzo). Quindi è necessario ricercare l'archiviazione delle chiavi e non l'archiviazione delle password.

Ci sono due parti per proteggere una chiave:

  1. Scegli una chiave casuale protetta da crittografia. Qualcosa come 128 bit da un CSPRNG andrà bene. È possibile codificare in base64 la chiave se si desidera memorizzarla come testo.

  2. Encrypt, not hash, la chiave quando non è necessaria. Usa qualcosa come AES 256 per la crittografia. Ciò porta a un problema circolare, in quanto è necessario archiviare tali credenziali in modo sicuro. Il posto migliore per questo è in un HSM. Se questo non è possibile, lo devi conservare da qualche parte. Basta non metterlo nello stesso database delle chiavi nel caso in cui un utente malintenzionato ottenga l'accesso al DB.

risposta data 01.06.2016 - 21:18
fonte

Leggi altre domande sui tag