Come crittografare i dati sensibili degli utenti e trasportarli in sicurezza tra client e server?

1

Cercherò di essere il più breve possibile al più presto possibile, sono nuovo di così, per favore, spogliati con me! Potrei commettere un errore enorme e nemmeno realizzato! Per favore aiuto! [facepalm emoji]

Requisiti dell'applicazione:

  • Il frontend deve essere un sito web
  • L'utente deve fornire la propria API TOKEN e SECRET a un'API di terze parti
  • Mentre sei loggato sul sito web, l'utente può attivare manualmente azioni su tale 3rd API attraverso l'interfaccia utente della mia applicazione
  • Mentre l'utente è disconnesso, il mio servizio deve effettuare chiamate programmate al servizio di terze parti (leggi come: un server deve essere in grado di leggere e inviare le sue chiavi tramite POST a un servizio di terze parti in testo semplice)

Ecco i passaggi che sto prendendo per ridurre il mio attacco di superficie:

  • Distribuisci un micro-servizio che sarà responsabile solo della memorizzazione delle chiavi e dei processi in background

  • Genera una chiave RSA per il mio micro-servizio

  • Nascondi il micro-servizio da parte dell'utente avendo solo l'url sul lato back-end (usa il mio server http come proxy)

Quando l'utente esegue manualmente un'azione tramite la mia interfaccia utente:

  • Genererò una chiave RSA sul lato client usando la sua password (deve essere strong) come passphrase e genererò una chiave a 1024 bit, invierò la chiave pubblica al server HTTP che la invierà al SECRETS SERVER

  • Sul server segreto se l'utente non è mai stato registrato salverò questo id_utente e la chiave pubblica associata

  • Quando l'utente inserisce le sue chiavi, crittograferò le chiavi con il tasto PUB del mio SECRETS SERVER e firmo con la chiave privata dell'utente

  • Pubblicalo sul mio SERVER HTTP che pubblicherà sul mio SECRETS SERVER

  • Il mio server segreto controlla se il messaggio è stato firmato da pub_key che esclude e se lo è, salva i dati utente crittografati con le proprie chiavi private (server) sul database

Quando deve essere eseguito un processo in background:

  • Il SECRETS SERVER legge la chiave dal database, decrittografa l'API KEYS, esegue l'HTTP POST e rimuove il testo in chiaro dalla memoria

Cosa potrebbe andare storto? (per quanto ho capito!)

  • Qualcuno accede al mio server HTTP, scopre il mio SECRET SERVER, vi entra, legge le credenziali del database e la chiave privata, prendo le chiavi API e scappa.

  • Qualcuno ha accesso alle mie credenziali, trova il computer server segreto, riesce a scaricare il database, trova la chiave privata, ottiene i tasti API e scappa.

Domande chiave:

  • Cos'altro potrebbe andare storto?

  • Generare una chiave RSA sul lato client utilizzando la password dell'utente come passphrase è "abbastanza buono"?

  • La chiave RSA generata sul client sarà costantemente identica indipendentemente dal computer che accedono?

  • Questo ha senso?

  • On questo thread se ho capito bene, è consigliabile "allungare" la passphrase prima di generare la chiave, ma dato che un utente può decodificare il file .js sul mio sito web, scoprirà anche come viene estesa la chiave, giusto?

Grazie per aver letto tutto! Apprezzo molto ogni consiglio.

    
posta kroe 23.06.2017 - 03:41
fonte

1 risposta

1

Questa sembra una soluzione eccessivamente complessa al problema. Una cosa importante da ricordare con la crittografia è che anche se il cryptosystem è implementato perfettamente, se uno degli endpoint è compromesso, l'hacker può accedere ai dati in chiaro. Il tuo microservizio non ha bisogno di essere reso segreto, né deve davvero essere reso separato dalla tua applicazione web principale. Avere su un server separato aggiunge davvero complessità.

La soluzione migliore, se le API di terze parti lo consentono, è quella di memorizzare e utilizzare i token OAuth. Archivia i token / segreto dell'API solo se OAuth non è disponibile.

Per quanto riguarda la trasmissione dei dati al server, non è necessario implementare la propria crittografia nel browser. L'SSL correttamente implementato risolverà il problema di trasmettere la chiave in modo sicuro. Prendi in considerazione l'utilizzo di Http Public Key Pinning (HPKP). Essere consapevoli delle potenziali insidie di HPKP prima di implementarlo.

Per quanto riguarda la memorizzazione dei token, i token OAuth / API devono essere memorizzati in un file salato & colonna crittografata nel database utilizzando un cifrario a blocchi simmetrico, la chiave deve essere archiviata in qualche posto all'esterno del database (per evitare che venga esposta tramite un attacco di SQL injection) e il lavoro di applicazione / batch Web dovrebbe essere in grado di accedere a tale chiave e decrittografare i token. La chiave che utilizzi per crittografare i dati sarà condivisa tra tutti i record e non dovrebbe essere resa disponibile al di fuori del server in cui sono archiviati i tuoi record.

    
risposta data 23.06.2017 - 18:07
fonte

Leggi altre domande sui tag