Creare un'app Android crittografata end-to-end conforme al GDPR
Ahoy comunità di Back4app!
Questo è un tutorial ospite del team di Virgil Security, Inc.: siamo la tecnologia crittografica dietro la messaggistica crittografata end-to-end di Twilio. I nostri amici di Back4app ci hanno chiesto di mostrarti come costruire un'app di chat crittografata end-to-end su Back4app.
In questo post, ti guideremo attraverso i passaggi per rendere un'app di messaggistica Android Back4App crittografata end-to-end! Sei pronto? PS: Se non ti interessano i dettagli, salta semplicemente alla fine del post e scarica il prodotto finale.
Innanzitutto, iniziamo con un rapido ripasso di cosa sia l'E2EE (crittografia end-to-end) e come funzioni. L'E2EE è semplice: quando digiti un messaggio in chat, viene crittografato sul tuo dispositivo mobile (o nel tuo browser) e viene decrittografato solo quando il tuo partner di chat lo riceve e desidera visualizzarlo nella finestra della chat.

Il messaggio rimane crittografato mentre viaggia su Wi-Fi e Internet, attraverso il cloud / server web, in un database e sulla strada di ritorno al tuo partner di chat. In altre parole, nessuna delle reti o dei server ha idea di cosa stiate chiacchierando.

Ciò che è difficile nella crittografia end-to-end è il compito di gestire le chiavi di crittografia in modo che solo gli utenti coinvolti nella chat possano accedervi e nessun altro. E quando scrivo “nessun altro”, intendo davvero: anche gli insider del tuo fornitore di cloud o anche tu, lo sviluppatore, sono esclusi; nessun errore accidentale o sguardi legalmente imposti sono possibili. Scrivere crittografia, specialmente per più piattaforme, è difficile: generare numeri casuali veri, scegliere gli algoritmi giusti e scegliere le modalità di crittografia corrette sono solo alcuni esempi che fanno alzare le mani nella disperazione alla maggior parte degli sviluppatori, che alla fine NON lo fanno.
Questo post del blog ti mostrerà come ignorare tutti questi dettagli fastidiosi e crittografare rapidamente e semplicemente End-to-End utilizzando il SDK di Virgil.
Per un'introduzione, ecco come aggiorneremo l'app di messaggistica di Back4app per essere End-to-End Crittografata:
- Durante la registrazione: genereremo le chiavi private e pubbliche individuali per i nuovi utenti (ricorda: la chiave pubblica del destinatario crittografa i messaggi e la corrispondente chiave privata del destinatario li decrittografa).
- Prima di inviare messaggi, crittograferai i messaggi di chat con la chiave pubblica del destinatario.
- Dopo aver ricevuto i messaggi, decrittograferai i messaggi di chat con la chiave privata del destinatario.

Pubblicheremo le chiavi pubbliche degli utenti nel Servizio di Carte di Virgil in modo che gli utenti della chat possano cercarsi a vicenda e crittografare messaggi l'uno per l'altro. Le chiavi private rimarranno sui dispositivi degli utenti.
Mantienilo semplice
Questa è l'implementazione più semplice possibile di una chat E2EE e funziona perfettamente per semplici app di chat tra 2 utenti dove le conversazioni sono di breve durata ed è accettabile perdere la cronologia dei messaggi se un dispositivo viene perso con la chiave privata.
OK, basta parlare! Passiamo al codice.
- Inizieremo guidandoti attraverso la configurazione dell'app Android,
- Poi, aggiungeremo del codice per rendere l'app crittografata end-to-end.
Per completare questo tutorial, hai bisogno di:
- Android Studio.
- Un'app creata su Back4App.
Iniziamo con il deploy della funzione cloud. Per questo, avrai bisogno di:
- Trova main.js e package.json nella directory scripts;
- Apri main.js con il tuo editor preferito.
1.1) Ottieni le credenziali di Back4App
- Apri Dashboard della tua app > Impostazioni App > Sicurezza e Chiavi:

- In main.js, sostituisci PARSE_APP_ID con il tuo ID dell'applicazione e PARSE_REST_API_KEY con il tuo chiave API REST:
1.2) Ottieni le credenziali di Virgil

- Apri la tua nuova applicazione Virgil, vai alla sezione E3Kit e genera un .env file sotto la sezione E3Kit nella barra laterale sinistra

- Copia i valori di APP_ID, APP_KEY, e APP_KEY_ID dal .env file

- Sostituisci i valori copiati nel tuo main.js file nei campi corrispondenti (main.js di scripts directory):
1.3) Distribuisci la funzione di codice cloud
- Apri il “Dashboard” di Back4App della tua app -> “Core” -> Funzioni di codice cloud;

- Clicca +AGGIUNGI e seleziona il tuo main.js e package.json (dalla directory scripts), dopo di che sposta entrambi nella cartella cloud;
- Clicca DISTRIBUISCI.
Non dimenticare di configurare prima la funzione di codice cloud di Back4App. È una parte obbligatoria di questa demo. Dopo di ciò, segui i seguenti passaggi:
2.1) Importa il progetto in Android Studio
- Apri Android Studio -> File > Nuovo > Progetto da Controllo Versione > Git
- URL del repository Git: https://github.com/VirgilSecurity/chat-back4app-android
- Controlla il clean-chat-kt branch

Importante!
Seleziona il tipo di file “Progetto” dell'albero dei file. Sarà utilizzato per tutto il tutorial:

2.2) Configura le credenziali di Back4App nel progetto
- Apri il “Dashboard” di Back4App della tua app -> “Impostazioni App” -> “Sicurezza e Chiavi”;

Vai al /app/src/main/res/values/strings.xml file nel tuo progetto android e sostituisci your_back4app_app_id con il tuo Application ID e your_back4app_client_key con il tuo Client Key:
2.3) Configura DB
- Apri Back4App “Dashboard” -> “Core” -> “Database Browser” -> “Crea una classe” e crea classi di Custom di tipo chiamato Message e ChatThread;

2.4) Configura la query live
- Premi il Pannello di controllo del server pulsante sulla tua Applicazione
- Trova il blocco “Web Hosting e Live Query”
- Apri le Impostazioni della Live Query e controlla l' Attiva Hosting opzione.
- Scegli un nome per il tuo sottodominio per attivare la Live Query per le 2 classi che hai creato: Messaggio e ChatThread.
- Copia il tuo nuovo nome di sottodominio e clicca sul pulsante SALVA:

Torna a /app/src/main/res/values/strings.xml e incolla “Nome del sottodominio” che hai inserito sopra nel back4app_live_query_url invece di “yourSubdomainName”:
Dopo questi passaggi sarai in grado di premere il pulsante Esegui in Android Studio e far funzionare il campione. Usa un emulatore o un dispositivo reale per testarlo.
Per vedere il risultato dell'esecuzione della versione pulita della demo, dovrai:
- Registrare 2 utenti;
- Avviare una conversazione tra di loro e inviare un paio di messaggi;

3. Apri Back4App “Dashboard” -> “Core” -> “Database Browser” -> “Message”.
Se tutto ha funzionato, dovresti vedere l'app di messaggistica chat apparire. Registrati due utenti e invia alcuni messaggi l'uno all'altro: dovresti vedere nuovi dati apparire nella Message classe.
Nota che puoi vedere sul server di cosa stanno chiacchierando i tuoi utenti:

Prossimo: Chiudi la tua interfaccia di chat e passa al passaggio successivo – aggiungere la crittografia E2EE.
Entro la fine di questa parte, i tuoi messaggi di chat appariranno così sul server: riesci a notare la differenza?

Come ci arriviamo? Ovviamente, dobbiamo implementare la crittografia end-to-end, il che significa che la nostra app deve:
- Generare la coppia di chiavi private e pubbliche come parte della registrazione
- Memorizzare la chiave privata nello storage delle chiavi sul dispositivo dell'utente
- Pubblicare la chiave pubblica nel Servizio Card di Virgil come una “Virgil Card” per altri utenti da scaricare e crittografare messaggi con essa
- Crittografare i messaggi con la chiave pubblica e firmare con la chiave privata; decrittografare i messaggi con la chiave privata e verificare con la chiave pubblica
Per questo, dovremo aggiungere E3Kit alla nostra applicazione demo pulita e un po' di codice in più per implementare tutto ciò che è stato descritto sopra.
Ma prima di iniziare, chiariremo due termini importanti per te: cos'è una Virgil Card e una chiave privata?
- Virgil Card - Le Virgil Cards contengono le chiavi private degli utenti. Le Virgil Cards sono pubblicate nel Servizio Card di Virgil (immagina che questo servizio sia come un elenco telefonico) affinché altri utenti possano recuperarle: Alice deve recuperare la chiave pubblica di Bob per crittografare un messaggio per Bob utilizzando quella chiave.
- Chiave privata - una parte privata della chiave di crittografia. Ricorda, le chiavi private possono decrittografare i dati che sono stati crittografati utilizzando la chiave pubblica corrispondente.
- Nell'app-level (Modulo: app) gradle a /app/build.gradle aggiungi (ma non sincronizzare ancora gli script gradle):
- Aggiungi quanto segue alla fine del tuo progetto-level /build.gradle (Progetto: chat-back4app-android):
- Ora puoi sincronizzare gli script gradle;
- Aggiorna la tua AppVirgil classe aggiungendo nuovi campi:
- Premi Alt+ Enter per importare le librerie necessarie nella classe.
- Nella ../virgilsecurity/virgilback4app/model/ directory, crea le classi dati AuthenticateResponse e VirgilJwtResponse che rappresentano le risposte dalle funzioni Cloud Code:
- Nella ../virgilsecurity/virgilback4app/util/ crea un AuthRx oggetto che implementa le chiamate alle funzioni Cloud Code (non dimenticare di importare tutte le librerie necessarie dopo):
Il token Virgil ricevuto dalle funzioni Cloud Code deve essere memorizzato localmente. Aggiorniamo la Preferences classe in ../virgilsecurity/virgilback4app/util/:
- Definisci la costante:
- Aggiungi le funzioni setVirgilToken, virgilToken e clearVirgilToken:
~~~kotlin
fun setVirgilToken(virgilToken: String) { with(sharedPreferences.edit()) { putString(KEY_VIRGIL_TOKEN, virgilToken) apply() } }
fun virgilToken(): String? { with(sharedPreferences) { return getString(KEY_VIRGIL_TOKEN, null) } }
fun clearVirgilToken() { with(sharedPreferences.edit()) { remove(KEY_VIRGIL_TOKEN) apply() } }
E3Kit si occupa delle tue chiavi private e pubbliche. Per generarle durante il processo di registrazione, dovremo fare quanto segue:
- In ../virgilsecurity/virgilback4app/util/crea RxEthree classe:
- Ora, aggiungi initEthree funzione che inizializza l'istanza di E3Kit in RxEthree classe:
- Aggiungi registerEthree funzione che registra un nuovo utente in RxEthree classe. E3Kit genera una coppia di chiavi durante la registrazione. La chiave privata generata viene quindi memorizzata nello storage locale, e la chiave pubblica viene pubblicata ai servizi Virgil come una Virgil Card.
- Facciamo alcune modifiche a LogInPresenter classe (in ../virgilsecurity/virgilback4app/auth/).
- Aggiungi rxEthree campo:
Aggiorna il requestSignUp funzione per eseguire la registrazione con E3Kit
Ora, apportiamo modifiche al requestSignIn metodo di LogInPresenter classe (in ../virgilsecurity/virgilback4app/auth/):
Successivamente, aggiungi funzioni che gestiscono l'inizializzazione di E3Kit nella ThreadsListFragment classe (in ../virgilsecurity/virgilback4app/chat/contactsList/):
Aggiorna postCreateInit funzione per inizializzare E3Kit:
E aggiungi il seguente codice nella ThreadsListFragmentPresenter classe in virgilsecurity.virgilback4app.chat.contactsList/:
- Aggiungi campo:
- e funzione
A questo punto siamo in grado di registrare/accesso a un utente e creare una nuova chat con un altro utente.
Ora aggiungiamo la crittografia per i nostri messaggi.
Aggiungiamo findCard funzione a RxEthree classe (in ../virgilsecurity/virgilback4app/util/) che ci aiuterà a ottenere l'ultima Virgil Card per nome utente:
Quando viene aperta una chat, dovremmo ottenere la Virgil Card del destinatario. Modifica postCreateInit di ChatThreadFragment classe (in ../virgilsecurity/virgilback4app/chat/thread/) sostituendo
codice con uno nuovo
E aggiungi due funzioni:
Ora cambiamo ChatThreadPresenter:
- Aggiungi campi:
- Aggiungi una funzione che ottiene una Virgil Card del destinatario:
- Aggiungi la crittografia dei messaggi in uscita in requestSendMessage funzione:
Aggiungi la decrittografia di tutti i messaggi in arrivo in ChatThreadRVAdapter classe (in ../virgilsecurity/virgilback4app/chat/thread/):
- Aggiungi campi:
- Implementa la decrittazione dei messaggi in onBindViewHolder funzione
Ora per vedere il risultato della nostra demo completamente crittografata end-to-end, segui di nuovo questi passaggi:
- Disconnetti l'utente precedente
- Registrati 2 nuovi utenti;
- Inizia una conversazione tra di loro e invia un paio di messaggi;
- Apri Back4App “Dashboard” -> “Core” -> “Database Browser” -> “Message”.
Importante! Devi Disconnettere l'utente attuale e registrare due nuovi utenti, dopodiché puoi iniziare una chat E2EE con questi due nuovi utenti. Il motivo è che i tuoi primi due utenti non hanno Virgil Card’s, quindi non puoi usare crittografia\decrittografia per loro.{: .blockquote-tip}
Fatto! Ora puoi vedere che i messaggi degli utenti sono crittografati e possono essere accessibili solo nell'app dagli utenti stessi.
La crittografia end-to-end è un modo per soddisfare i requisiti tecnici per HIPAA (l'Atto di Portabilità e Responsabilità dell'Assicurazione Sanitaria degli Stati Uniti del 1996) e GDPR (il Regolamento Generale sulla Protezione dei Dati dell'Unione Europea). Se hai bisogno di ulteriori dettagli, registrati per un account Virgil, unisciti alla nostra comunità Slack e contattaci lì: siamo felici di discutere le tue circostanze di privacy e aiutarti a capire cosa è necessario per soddisfare i requisiti tecnici di HIPAA e GDPR.
Progetto finale. Se ti sei perso pezzi del puzzle, apri il ramo del progetto E2EE. Puoi inserire le credenziali della tua applicazione in questo codice (come hai fatto durante l'articolo) e costruire il progetto.
Puoi trovare ulteriori informazioni su cosa puoi costruire con Virgil Security qui.