Il modo migliore per salvare nome utente / password a livello di programmazione

3

Ho il requisito di salvare a livello di programmazione un nome utente e una password sulla workstation locale e recuperarli.

Quale sarebbe il modo più sicuro per farlo?

Ho usato DPAPI in passato con successo ma sembra che DPAPI usi 3des che è stato deprecato.

La CNG-DPAPI sarebbe la scelta migliore? Qualche altro metodo che sarebbe più sicuro?

Grazie, Mike

    
posta Mike M 08.09.2018 - 00:00
fonte

1 risposta

0

3DES non è stato deprecato, né DPAPI. Anche se l'algoritmo 3DES non è l'ideale e non dovrebbe essere usato in nuovi design dove è evitabile, l'attacco migliore contro cui ci imbattiamo è un attacco "meet-in-the-middle" che richiede 512PiB di RAM che corregge gli errori e 2 112 + 2 56 operazioni. Considerando altri possibili attacchi contro DPAPI, ad es. utilizzando il modulo DPAPI mimikatz su un sistema in esecuzione, questo sembra piuttosto stravagante.

CNG-DPAPI (che ora è chiamato DPAPI-NG) sarebbe una scelta migliore per i progetti moderni. Sfortunatamente gli esempi là fuori sono piuttosto scarsi, lasciandoti lavorare molte cose da te. Di seguito è riportato un esempio di alto livello su come implementare l'archiviazione segreta utilizzando DPAPI-NG:

  • Chiama NCryptCreateProtectionDescriptor con dwFlags impostato su 0 e pwszDescriptorString impostato su una stringa descrittore di protezione. Per proteggere i dati in modo che solo l'utente corrente possa accedervi, usa "LOCAL=user" , e per la protezione a livello di macchina usa "LOCAL=machine" . È inoltre possibile crittografare su un set di credenziali Web in un contesto ASP, un certificato dall'archivio certificati, un utente di dominio specificando un SID oppure è possibile specificare un descrittore di sicurezza completamente personalizzato utilizzando SSDL.
  • Chiama NCryptProtectSecret , passando l'handle ottenuto dall'operazione precedente, per crittografare piccole quantità di dati (ad esempio una stringa di credenziali)
  • Chiama NCryptStreamOpenToProtect se desideri crittografare molti dati. Questo apre uno stream in cui puoi scrivere i dati tramite NCryptStreamUpdate .
  • Chiama NCryptUnprotectSecret per decrittografare i dati crittografati con NCryptProtectSecret .
  • Chiama NCryptStreamOpenToUnprotect per decrittografare i dati crittografati con NCryptStreamOpenToProtect . Di nuovo, qui viene utilizzato NCryptStreamUpdate .
  • Se hai utilizzato una delle funzioni del flusso, chiama NCryptStreamClose per chiuderle.
  • Chiama NCryptCloseProtectionDescriptor per chiudere l'handle del descrittore di protezione che hai creato nel primo passaggio.

DPAPI-NG è ancora influenzato da strumenti come mimikatz, ma questa è solo una parte inerente di come funziona la sicurezza del sistema operativo - se un utente malintenzionato sta eseguendo il codice come amministratore, ha vinto.

La vecchia API per DPAPI è molto più semplice, ma la nuova API ha un supporto più completo per diversi scenari di sicurezza come descritto sopra. La crittografia in uso non è certamente l'anello più debole della catena per entrambe le API.

    
risposta data 12.11.2018 - 16:19
fonte

Leggi altre domande sui tag