Scrittura di un sistema di gestione delle password, necessita di consigli sull'archiviazione del database

0

Sto scrivendo un sistema di gestione della password collaborativo e ho domande relative alla memorizzazione di password crittografate. Essenzialmente, vorrei che diversi utenti potessero accedere e modificare un database.

Livello alto:

  • L'utente esegue il client che richiede l'autenticazione nome utente / password (backend con AD / Samba / Radius / local).
  • In caso di successo, all'utente viene richiesto di inserire una password per il codice di accesso condiviso . Questo dovrebbe essere noto a tutti gli utenti che hanno accesso.
  • Il database crittografato viene inviato al client che lo decrittografa e lo visualizza all'utente autenticato.

Leggermente più dettagliato:

  • All'inizializzazione del database, viene generata una chiave casuale e crittografata con la password del keyring leggibile. Questa chiave crittografata è memorizzata sul disco.
  • Ogni voce nel database che contiene le password viene archiviata crittografata con la chiave originale.
  • La password del portachiavi è quindi necessaria per decrittografare il resto delle password.
  • La password del portachiavi può anche essere aggiornata senza ricodificare l'intero database. Tutto ciò che accade è decifrare la chiave con la password precedente e ricodificare la chiave con quella nuova.

Questo è tutto per niente? Questo è considerato un cattivo design? Il mio obiettivo è impedire a qualcuno di scaricare semplicemente il database se si ha accesso al server. L'ho trasmesso da un mio amico che, scherzando, ha detto "Sì, perché questo impedisce alle persone di rubare il database di Chrome". Quanto seriamente dovrei prenderlo?

Qualche raccomandazione per una corretta progettazione, algoritmi da usare, ecc.?

    
posta Goodies 01.03.2017 - 22:35
fonte

2 risposte

2

La tua soluzione funzionerebbe per un team molto piccolo. Chiunque conosca la password del portachiavi sarà in grado di vedere tutti i segreti memorizzati nel database. Se vuoi rimuovere un utente, dovrai cambiare la password e ridistribuirla al resto del team.

Un approccio migliore per il database dei segreti collaborativi sarebbe utilizzare la crittografia asimmetrica. Considera questo design:

  • Ogni utente ha la propria chiave privata e pubblica registrata nel database
  • La chiave privata viene archiviata enrypted con AES (o altro algo simmetrico), con la chiave derivata da una password utente
  • La chiave pubblica è memorizzata non criptata
  • Ogni segreto viene crittografato con una chiave generata da un CPRNG strong
  • La chiave stessa è crittografata con la chiave pubblica degli utenti
  • La condivisione di un segreto viene eseguita crittografando la chiave generata con una chiave pubblica dell'utente con cui vuoi condividere il segreto con

Questo è grosso modo il modo in cui altri gestori di password ( per esempio LastPass ) condividono segreti.

    
risposta data 04.03.2017 - 12:55
fonte
0

Osservando la tua proposta, tenderei a pensare che non esista un enorme vantaggio rispetto all'aver, ad es. KeePass disponibile per gli utenti e una posizione centrale per memorizzare i vari file di database.

Come menzionato da @ MarkoVodopija , il problema maggiore qui è che la rimozione dell'accesso per un dato utente è non banale una volta consegnato il database in primo luogo. Ciò richiederebbe sia la modifica della password per il DB stesso (e l'ottenimento della nuova password per tutti gli utenti legittimi) sia la modifica di tutte le password presenti nel database.

Un documento che potresti trovare utile è la panoramica sulla sicurezza di Hashicorp Vault ( link ) - potrebbe aiutarti sforzo per capire come si presenta il tuo modello di minaccia, e vedere se e dove, la tua attuale soluzione non è sufficiente.

    
risposta data 04.03.2017 - 13:34
fonte

Leggi altre domande sui tag