Controllo di una stringa memorizzata localmente per manomissione

3

Sto lavorando a una partita multiplayer usando WebSockets. Ho deciso che tutti i dati dell'utente verranno memorizzati sul client, eliminando la necessità di autenticazione tramite password ecc.

LocalStorage
'save' -> '{"key":"value", "key2":"value2"}'
'hash' -> '<hash of save>'

L'idea è di memorizzare i dati dell'utente in testo semplice, ma anche di memorizzare un hash che può essere calcolato solo dal server (eseguendo Node.JS). Il client invierà sia save che hash al server da verificare e caricato in memoria per questa sessione.

Ora la mia domanda è:

  • Se utilizzo SHA256 per cancellare tutti i dati di save , come posso impedire a un utente di generare il proprio hash per i dati?
  • Quindi, supponendo che la risposta alla parte 1 sia "sale",) l'uso di sale mi terrà al sicuro o può essere calcolato? (Posso rendere il sale parzialmente diverso per ogni utente)
posta Peter Gordon 02.09.2016 - 21:19
fonte

2 risposte

4

Quello che vuoi è qualcosa che assicuri l'integrità dei tuoi dati.

La soluzione più comune per questo è utilizzare un HMAC, ovvero un digest con chiave. NodeJS ha un'API che calcola HMAC . Rispetto a un hash "salato", in cui manterrai il sale privato, gli HMAC sono progettati per essere sicuri anche contro alcuni attacchi aggiuntivi, come gli attacchi di estensione della lunghezza.

Se la chiave viene mantenuta privata (e abbastanza grande), dovresti essere in grado di utilizzare la stessa chiave per tutti gli utenti.

Tieni presente che ciò non impedirà alle persone di inviarti una versione precedente dei dati. Tutto ciò è garanzia che i dati erano validi in qualche momento. Se vuoi essere sicuro che ti stiano inviando l'ultima versione, ti occorrerebbe un po 'di spazio di archiviazione sul lato server per memorizzare un numero di versione, un timestamp o l'ultimo riepilogo dei dati. Se si sceglie di memorizzare l'ultimo digest, sarà sufficiente un normale hash, non sarà necessario inviare l'hash o un HMAC al client.

    
risposta data 02.09.2016 - 22:47
fonte
1

No, il sale (in senso classico - valore noto sia al server che al client) non aiuterà.

Quando si genera l'hash, il server dovrebbe crittografarlo usando un segreto noto solo a se stesso (e mai a nessun client) e, in fase di ricezione, lo decrittografa e quindi controlla.

Ma suppongo che per salt probabilmente intendessi prependere la quantità (presumibilmente grande) di dati segreti solo server a save di dati, e quindi fare SHA3 (o HMAC) su quel risultato. Sì, sarebbe anche abbastanza sicuro. (Ma assicurati che il segreto sia ragionevolmente grande in modo che l'utente non possa rinforzarlo, meglio ancora anteporre un grande segreto e aggiungere un altro grande segreto per una maggiore capacità di recupero).

Come menzionato da @AgentME nei commenti, fai attenzione agli algoritmi di hashing utilizzati a causa di alcuni di loro che sono sospettabili per Attacco con estensione di lunghezza

    
risposta data 02.09.2016 - 22:13
fonte

Leggi altre domande sui tag