App nativa, autenticazione token senza login / password

0

Sto lavorando a un gioco mobile sempre online (app nativa per Android / iOS con Unity) e vorrei poter autenticare il lettore senza bisogno di login / password all'inizio. Per coloro che sanno, cerco di ottenere uno schema di autenticazione simile ai famosi giochi Supercell (Clash of Clans, Boom Beach, ecc.) Cosa ho in mente:

  • La prima volta che l'utente avvia il gioco, viene eseguita una richiesta al server per un nuovo account, il server invia un UUID.

  • Questo UUID è memorizzato nel dispositivo (dovrei crittare o cancellarlo?).

  • Quando l'utente avvia il gioco, lo autenticano con un token ( UUID+timestamp+hmac(sha256, username+timestamp, K) ). È meglio generare un token di sessione temporaneo (memorizzato nel database) o potrei usare il token precedente per tutte le richieste dopo l'autenticazione?

  • Per ogni richiesta invio token+params+timestamp+hmac(sha256, token+params+timestamp, K)

E ogni comunicazione sarà su SSL.

è totalmente insicuro?

NB: Nel gioco potrai fare acquisti in-app e in questo caso la prima volta che proverai a comprare qualcosa dovrai legare il tuo gioco con il tuo account GameCenter o Google Play o Facebook. Queste informazioni saranno archiviate nel database. Devo usare questi account per autenticare se è possibile?

Come puoi vedere, nulla è chiaro nella mia testa e io non sono sicuramente un esperto in sicurezza. Quindi ogni piccolo consiglio sarà apprezzato.

    
posta MamaWalter 06.08.2014 - 17:33
fonte

2 risposte

2

Qual è il tuo modello di minaccia?

Se ogni connessione viene inviata tramite SSL, non è necessario preoccuparsi di qualcuno che annusa le tue comunicazioni. Questa è in realtà la parte più strong del tuo sistema. Buon lavoro scegliendo qualcosa di standard.

Poiché SSL garantisce che nessuno stia ascoltando le tue comunicazioni, dovremmo esaminare gli endpoint. Il tuo UUID è fondamentalmente un segreto condiviso. Chiunque abbia questo UUID sarà in grado di imitare i tuoi utenti.

Per quanto riguarda criptarlo o cancellarlo, no. Non si disturbi. Se hanno accesso al tuo UUID crittografato, hanno certamente accesso al codice sorgente per il tuo gioco, che dovrebbe contenere la password. Tutto ciò che potrebbe impedire all'autore di un attacco di autenticare anche impedirebbe l'autenticazione da parte del cliente.

Devi sviluppare un modello di minaccia. Cosa farebbe un aggressore se riuscissero a mettere le mani su un UUID? Se tutto ciò che possono fare è negli acquisti di giochi per quell'account, allora c'è poco da guadagnare dall'avere un UUID. Potrebbero provare a far incazzare un cliente rubando l'UUID e usandolo per comprare un sacco di cose che il cliente non voleva, ma se si è in grado di rimborsarlo, allora non possono nemmeno incazzare un cliente.

D'altra parte, se gli UUID possono essere usati per acquistare cose che sono utili per gli altri, allora hai più incentivo per gli attaccanti a rubarli. Se possono essere utili alla mafia, allora hai una minaccia ancora più grande, perché potrebbero lanciare una delle loro botnet sul tuo sistema.

Tutta la sicurezza è basata su un modello di minaccia. Niente è perfettamente sicuro. Come disse una volta Kevin Mitnick: "L'unico computer completamente sicuro è uno che è disconnesso da Internet, spento, incassato nel cemento in fondo a un silos sorvegliato da guardie armate. Anche allora, lo controllerei una volta in un mentre ".

    
risposta data 29.11.2014 - 06:51
fonte
1

This UUID is stored in the device (should i crypt or hash it ?) :

  • Per l'applicazione Android puoi utilizzare questa libreria , che è un wrapper crittografato per SharedPreferences, perché SharedPreferences su Android memorizza i dati in "testo normale", quindi un attacker può facilmente avere accesso a questi dati.
  • Per l'applicazione iOS: Keychain è un luogo sicuro di memorizzare credenziali e sensibili informazioni, ma non è difficile vieni dentro ( specialmente sul dispositivo jailbroken).

When the user start the game i authenticate him with a token (UUID+timestamp+hmac(sha256, username+timestamp, K)). Is it better to generate a temporary session token (stored in the database) or could i use the previous token for all the requests after authentication?

Il token di accesso deve essere gestito sul lato server, perché può essere modificato sul lato client (ad esempio: un utente malintenzionato può modificare il valore del timestamp corrente del dispositivo) e i token di accesso sono generalmente temporanei, quindi devi aggiornarli dopo un determinato periodo di tempo a seconda della criticità della tua applicazione.

    
risposta data 07.08.2014 - 10:56
fonte

Leggi altre domande sui tag