Archiviazione di NetworkCredential nel database SQL

3

Ho un progetto web in cui ho bisogno di memorizzare un nome utente e una password in un database SQL. il nome utente / password sono per i servizi di scambio web (quindi non può essere sottoposto a hash, devo poter recuperare una password di testo chiaro) Ogni utente della pagina web dovrà inserire il suo nome utente e la password una volta e questa è l'informazione che voglio per memorizzare nel database SQL, ma in un modo che non è possibile decrittografarlo per gli altri, quindi l'utente ha effettuato l'accesso all'applicazione Web (a causa di problemi di sicurezza). Stavo pensando che avrei potuto farlo utilizzando la password degli utenti per l'applicazione web per crittografare e decodificare la password. In questo modo è possibile decrittografare la password di scambio solo se si conosce la password dell'utente per l'applicazione web. (che è hash per questa applicazione web)

L'applicazione web utilizza l'autenticazione basata su form e gli utenti hanno l'opzione "Ricordami" in modo che non debbano accedere ogni volta e questo è il problema. Potrei non ottenere una richiesta con password per ogni nuova sessione. I server di scambio sono fuori dal nostro controllo, quindi non possiamo usare alcuna imitazione, aggiungere utenti con autorizzazioni speciali alle caselle di posta ecc. L'unica cosa che sappiamo sul server di scambio è ciò che otteniamo attraverso il servizio di scambio automatico di scambio.

L'unico modo che posso pensare è di creare una rappresentazione hash della password dell'utente e memorizzarla come cookie di autenticazione. Quindi posso usare questo hash (più un po 'di sale) per crittografare e decifrare la password per i servizi web di scambio.

È un modo sicuro per farlo? c'è un modo migliore per risolvere questo problema?

    
posta Mr Zach 23.10.2016 - 11:07
fonte

1 risposta

2

Non sono sicuro se c'è un modo migliore, ma è così che lo farei. Penso che sia simile a ciò che descrivi nella domanda.

  • Memorizza le credenziali di rete crittografate con una chiave derivata dalla password dell'utente, ad es. utilizzando PBKDF2). (Se si memorizzano anche gli hash delle password per l'autenticazione, utilizzare un sale diverso in modo che non siano identici.) In questo modo, se il database è compromesso, le credenziali di rete saranno comunque relativamente sicure.
  • Per rendere disponibili le credenziali di rete senza il reinserimento della password, li criptico con una chiave casuale e memorizzo il valore crittografato (ma non la chiave) in una tabella separata. La chiave che invierei come cookie (con timeout appropriato) all'utente. In questo modo, se il tuo database è compromesso, le credenziali di rete sono ancora al sicuro perché la chiave non è presente.
  • Si noti che utilizzerei una chiave casuale protetta da crittografia e non qualcosa correlata all'utente, password o ID di sessione.
  • Rimuovi le voci dalla tabella non appena la sessione scade o l'utente si disconnette.

Il retro di questo è ovviamente che un utente che può rubare il cookie può decrittografare le credenziali di rete. Ma questo sarà un problema per qualsiasi sistema in cui non è richiesto reendry di password - qualcuno che potrebbe rubare il cookie di sessione potrebbe apparire come registrato in ogni caso. Quindi penso che sia un inconveniente con non requering reentry password, e non con questa particolare soluzione.

Disclaimar: Questa non è la mia area di esperti, quindi potresti volere una seconda opinione su questo.

    
risposta data 23.10.2016 - 11:32
fonte

Leggi altre domande sui tag