Garantire la comunicazione

2

Il problema:

Ho un client open source (un componente aggiuntivo di Firefox scritto in JavaScript) e un server che contiene informazioni utente abbastanza sensibili: nome utente e cronologia utente (tutto da YouTube). Il client è in grado di aggiungere nuove voci alla cronologia e di interrogare la cronologia completa (indicando il suo nome utente). La comunicazione è su protocollo HTTP. Il problema è che non c'è passkey o autenticazione. Ciò significa che chiunque può fingere di essere qualcuno, creando false richieste HTTP, con dati GET modificati e recuperando una cronologia completa di un altro utente.

Come posso generare una password (o hash), che non può essere indovinata, ma può essere utilizzata per autenticare il client?

Possibili soluzioni (o cosa ho già pensato / provato già)

1. Crea un sistema di registrazione per questo servizio

Potrei aggiungere un modulo di registrazione e un modulo di accesso e associare l'utente del servizio all'utente di YouTube a qualche tipo di verifica, ma questo è un problema per l'utente. È davvero solo un servizio di base, quindi sarebbe eccessivo.

2. Rendilo chiuso

I componenti aggiuntivi di Firefox non sono necessariamente open source. Rendendola chiusa, potrei fare un semplice trucco come creare una funzione di hashing del costo (o semplicemente una semplice soluzione per l'hash) che è nascosta dalla fonte chiusa. In questo modo genererei una password direttamente dal nome utente. Ci sono due opzioni qui:

a.) Crealo come componente C ++ XPCOM. Ci ho provato. Ma risulta, anche questo è eccessivo. È molto incompatibile tra le versioni di gecko e non ho nemmeno potuto compilarlo su piattaforme diverse. È davvero difficile eseguire il debug, non c'è quasi alcun supporto e soprattutto: non mi piace l'idea di mantenere un pezzo binario compilato per ogni versione di Firefox per ogni piattaforma solo per avere 5 linee di codice incapsulate in un'interfaccia a 300 linee . Inoltre, cosa succede se decido di portare questo componente aggiuntivo per Chrome? Non esiste qualcosa come XP-COM.

b.) Rendilo un JavaScript offuscato. Non so come scrivere codice JS che è difficile da decifrare. È anche molto più facile copiare semplicemente incollare il codice offuscato, cambiare il parametro iniziale e avere l'hash per il nome utente desiderato. Con il componente XPCOM è così difficile lavorare, quindi isolarlo ed eseguirlo con un falso nome utente, che quasi considero tale sicurezza accettabile: D.

3.) Ottieni password da YouTube

Se potessi ottenere un codice da YouTube, altrettanto facilmente ottengo il nome utente (ottenere una pagina fittizia in background e recuperare il nome utente dal codice sorgente). Sarei salvato. Ma non posso. Non c'è modo di ottenere la vera password, forse se è salvata potrei ottenere in quel modo, ma non posso basarmi su quello. Beh, non ho bisogno della vera password comunque, va bene finché è un segreto, è unico per utente e costante per utente (ogni utente ha uno e solo uno, disponibile in qualsiasi momento).

a.) Ho cercato il codice sorgente di YouTube e i parametri del player incorporato e ho trovato qualcosa, ma non ero segreto. Era da qualche parte nel profilo e potevo vedere i codici di altri utenti. Quindi questo significa: non ho trovato nulla.

b.) Ho anche controllato i cookie. Ma dopo un nuovo log-in non c'era nessun valore del cookie che non ha cambiato il suo valore. Non che io possa capire che cosa fa il cookie.

Panoramica

Il problema di tutto questo è che ... sono così poco professionali. Ho postato questa domanda nella speranza di un metodo interessante inventato per scenari come questo. Una stretta di mano o qualcosa del genere.

Ho bisogno di questo perché devo scrivere un Termini di servizio per il mio componente aggiuntivo. E non posso semplicemente scrivere dentro che sto salvando la tua cronologia su un server esterno per il vantaggio che puoi usare il mio add-on su molti computer senza alcuna sicurezza , che chiunque scarichi Fiddler, e sa quale protocollo HTTP è in grado di visualizzare semplicemente quali video hai guardato.

Ci scusiamo per il fatto che la domanda sia lunga e scusa se è fuori tema (spero che non lo sia).

    
posta Máthé Endre-Botond 02.04.2012 - 05:04
fonte

1 risposta

4

Non c'è modo di implementarlo in modo tale che sia gestibile e abbia una sicurezza efficace. Il fatto che sia necessario utilizzare HTTP (e quindi non HTTPS) rende molto, molto difficile proteggere il sistema dagli attacchi MITM / replay. Generare un hash in modo deterministico dal nome utente direttamente non aiuta veramente - non risolve il problema MITM ed espone il sistema agli attacchi di forza bruta.

Potresti solo generare un valore casuale, memorizzarlo in un cookie di lunga durata e usarlo come identificatore di sessione (in pratica un surrogato della password) abbinandolo a un nome utente al primo accesso - questo sarà comunque vulnerabile a XSS e MITM - ma poi hai il problema aggiuntivo di come reimpostare la password degli utenti.

Non puoi ottenere la password dell'account youtube da YouTube - ma puoi ottenerla dall'utente insieme al nome utente di YouTube e verificarlo per validità.

Penso che potresti fare molto peggio di quello che viene fatto qui - usando un ID di sessione di lunga durata, autenticato contro openid o un servizio specifico per l'applicazione. (Ma tieni presente che questo non è totalmente sicuro).

    
risposta data 02.04.2012 - 16:01
fonte

Leggi altre domande sui tag