Come memorizzare le conversazioni di chat sul mio sito web?

5

Sto creando un sito in cui i membri sono in grado di chat individuali e non sono sicuro di come elaborare i testi delle conversazioni. Devo memorizzare il testo in un file .txt o direttamente in un database?

Mi chiedo anche se dovrei criptare il testo in qualche modo, in modo che se qualcuno supera il database, lui o lei non otterranno un testo in chiaro delle conversazioni dei miei membri. I membri del mio sito si iscrivono per uscire con altre persone per divertimento, quindi non credo che ci sia qualcosa di super segreto nelle loro conversazioni. Tuttavia, volevo solo aggiungere quel livello di sicurezza e allo stesso tempo ottenere esperienza se avrò bisogno di mantenere il testo inviato dagli utenti segreto in futuro.

    
posta DannyCruzeira 18.08.2012 - 13:06
fonte

3 risposte

5

Non è particolarmente pulito, efficiente o semplice, ma è uno schema che farà questo per te.

  1. Genera una coppia di chiavi RSA per ogni utente.
  2. Genera una chiave di archiviazione dalla password dell'utente, utilizzando una funzione di derivazione chiave (ad esempio PBKDF2)
  3. Cripta la chiave privata con AES, utilizzando la chiave di archiviazione.
  4. Calcola gli hash HMAC-SHA256 per le chiavi pubbliche e private, utilizzando la chiave di archiviazione come chiave HMAC.
  5. Archivia questi valori nel database.

Quando si invia un messaggio da Alice a Bob, effettuare le seguenti operazioni:

  1. Alice genera una chiave di messaggio e la crittografa con la chiave pubblica di Bob.
  2. Alice crittografa il suo messaggio con la chiave del messaggio.
  3. Alice calcola la sua chiave di archiviazione, usando la sua password. Lo usa per decodificare la sua chiave privata, quindi verifica che gli hash HMAC-SHA256 corrispondano alle sue chiavi pubbliche e private.
  4. Alice concatena il messaggio crittografato e la chiave crittografata in un singolo testo cifrato e lo firma utilizzando la propria chiave privata.
  5. Alice invia il testo cifrato a Bob.

Quando Bob vuole leggere il messaggio:

  1. Bob calcola la sua chiave di archiviazione, usando la sua password. Lo usa per decifrare la sua chiave privata, quindi verifica che gli hash HMAC-SHA256 corrispondano alle sue chiavi pubbliche e private.
  2. Bob decrittografa la chiave del messaggio di Alice usando la sua chiave privata.
  3. Bob utilizza la chiave del messaggio per decrittografare il messaggio.
  4. Bob autentica il messaggio verificando la firma digitale utilizzando la chiave pubblica di Alice.

Questo schema ha le seguenti proprietà:

  • I messaggi acquisiti dal database non possono essere decifrati senza conoscere le password degli utenti.
  • Le chiavi private non possono essere decifrate senza conoscere le password degli utenti.
  • Ogni messaggio è crittografato con una chiave indipendente.
  • Un utente malintenzionato con privilegi di scrittura nel database può falsificare un messaggio da un utente, sostituendo la sua chiave pubblica, ma l'utente mittente verrà avvisato di questo quando accedono poiché gli hash HMAC eseguiranno non corrisponde.

Se la considerazione di sicurezza finale è un problema, considera l'invio di un riassunto della chiave pubblica del mittente in ogni messaggio. In questo modo, se una conversazione legittima si verifica in qualsiasi momento, il sistema può verificare la chiave pubblica contro il digest inviato nelle conversazioni precedenti.

    
risposta data 20.08.2012 - 11:22
fonte
5

Non preoccuparti della crittografia. Non importa (dal punto di vista della sicurezza) se si trova in un file .txt o in un database. Invece, la singola cosa più importante che puoi fare per la sicurezza e la privacy dei tuoi utenti è:

Non conservare i dati più del necessario!

Le persone hanno certe aspettative sulla chat. Si aspettano che chattare online sia come chattare offline (sulla veranda, o qualcosa del genere): che non ci sia un record permanente che viene regolarmente tenuto di tutte le chat. La gente probabilmente si aspetta che le chat siano normalmente riservate. Quindi, non violare le loro aspettative. Non tenere traccia delle loro chat. Elimina tutti i record dopo un tempo ragionevole (ad esempio, dopo un giorno o il più velocemente possibile). Quindi, se sei compromesso, il danno sarà modesto, e non dovrai andare dai tuoi utenti, a testa alta, ammettendo che gli hacker hanno avuto accesso a tutte le loro chat passate, per sempre.

    
risposta data 19.08.2012 - 00:35
fonte
2

La chat dovrebbe essere crittografata, anche se solo leggermente, per renderla non banale da visualizzare. Elimina anche le righe più vecchie di un mese o quando il registro diventa più di 300 righe o giù di lì, quindi se il database e la chiave di decrittografia vengono mai compromessi, la loro privacy sarà alquanto protetta. Tuttavia, l'utente potrebbe voler salvare la chat (lo farei), quindi è meglio offrirgli un'opzione per archiviarlo per un periodo più lungo e scaricare tutto ciò che verrebbe eliminato dal server.

Non sono sicuro che sia utile crittografarlo con la password dell'utente. Potrebbe anche rendere più semplice l'attacco dell'utente malintenzionato, con un'iniezione SQL potrebbe essere in grado di visualizzare le password dell'utente. Una chiave di decodifica hardcoded offrirebbe un secondo fattore; il database compromesso non è abbastanza. Tuttavia è sempre possibile trovare una chiave di decodifica quando il server è compromesso (operazione che potrebbe essere più facile quando il database viene violato, specialmente quando un utente malintenzionato può scrivere nel database), quindi non è possibile fare affidamento su questo.

L'unico modo per proteggere realmente le chat dell'utente è generare una coppia di chiavi privata e pubblica e fare in modo che l'utente scarichi la chiave privata senza conservarne una copia. La chat può essere decifrata con la chiave privata (dovrebbe essere inserita al caricamento di qualsiasi chat dal database), e con la chiave pubblica è possibile crittografare e memorizzare la chat. Questo è probabilmente poco pratico e troppo lavoro però.

    
risposta data 18.08.2012 - 19:41
fonte

Leggi altre domande sui tag