Qual è il modo migliore per proteggere l'accesso a un sito Web senza SSL o chiavi già condivise?

7

Oggi ho annusato un traffico wlan non criptato durante le lezioni e ho trovato alcune password con una semplice ricerca di "pass" e "user" in wireshark. Si scopre che circa la metà dei siti che usiamo per la scuola non crittografano i loro dati in alcun modo - usano richieste GET come? Username = user123 & password = passwd123 al login. Ho iniziato a pensarci e ora mi chiedo; qual è il modo migliore per evitarlo? La crittografia sarebbe facile da annullare e anche le chiavi una tantum potrebbero essere "facilmente" catturate. Il mio miglior pensiero fino ad ora è l'hash del client, ma sarebbe una cattiva idea in qualche modo?

UPDATE: Ovviamente non ti ho detto i limiti qui, ma grazie per tutte le risposte! Il server non ha SSL e tutto ciò che uso deve essere implementato sul lato server php / asp / asp.net o javascript sul client. L'unica chiave già condivisa è la password. Tutto il resto sarà noto all'attaccante.

Sto solo cercando di nascondere la password dall'hacker. Il resto delle informazioni non sarebbe stato criptato, quindi sarebbe stato possibile rubare una sessione. Questo sarà il prossimo problema. Forse potresti criptare le informazioni sulla pagina con il sostantivo. Dal momento che ci sarà un sacco di testo crittografato, un attacco al dizionario sarebbe efficace. Questo è il motivo per cui non voglio usare la password dell'utente per la crittografia. Forse potrei usare qualcosa come una chiave XOR a 512/1024 bit che crittografo con la password dell'utente? O qualche parte della password, dal momento che un attacco di dizionario sarebbe ancora possibile - ma più difficile.

Un sostantivo criptato con i client direbbe che 2 primi caratteri della sua password sono una buona idea? Un numero casuale XOR con i primi 2 caratteri delle password. Questo dovrebbe essere decifrabile dall'utente, dal momento che lui / lei ha la chiave (che verrebbe presa dalla stringa password inserita tramite js). Il sostantivo sarebbe un numero casuale, quindi nulla dovrebbe essere in grado di dire se è stato correttamente decifrato.

In sostanza:  1. L'utente digita nome utente e post / lo ottiene sul server.  2. Il server risponde con una pagina con un nome cifrato e una casella di password.  3. Javascript decrittografa nounce, e la password ottiene XOR'd con esso.  4. La password viene inviata al server, la password viene decrittografata e quindi cancellata  5. Hash viene confrontato con uno memorizzato nel database.

Nota: il server è gratuito e supporta SSL, ma non voglio usarlo. SSL non mi piace perché è rotto.

    
posta Filip Haglund 15.11.2011 - 21:10
fonte

9 risposte

13

Vuoi che il server di destinazione sia in grado di accedere al nome utente e alla password, e non all'attaccante con lo sniffer. Quindi il server di destinazione deve essere in grado di fare qualcosa che l'aggressore non può fare. Dato che l'attaccante può acquistare lo stesso tipo di PC rispetto al server, quella potenza extra deve essere qualcosa che il server conosce, ma non l'aggressore.

Ehi, ci è tali dati: la password! Questo è il punto, non è vero? È davvero una chiave pre-condivisa tra client e server.

Le password sono piuttosto pessime, per quanto riguarda la chiave, a causa dei limiti del cervello umano. Tuttavia, si può lavorare con quello. I migliori protocolli disponibili sono Scambio chiavi autenticati tramite password : possono escalation di una chiave a bassa entropia condivisa (la password) in una chiave ad alta entropia condivisa, con la quale puoi fare tutte le cose gustose della crittografia simmetrica, che terrà a bada gli squali (filo). E i protocolli PAKE possono farlo resistendo agli attacchi del dizionario offline ("offline" è la parola importante qui).

La cattiva notizia è che i protocolli PAKE e, più in generale, qualsiasi protocollo di autenticazione che può essere collegato in seguito con i dati scambiati in modo che l'autenticazione resista davvero all'attacco dell'attaccante attivo, sono difficili da ottenere. Il protocollo più semplice ma ancora sicuro risulta essere SSL con SRP (c'è un RFC per quello). La buona notizia è che SSL + SRP fornisce autenticazione reciproca basata su password tra client e server utilizzando nessun certificato di sorta (e quando le persone dicono che non vogliono usare SSL, ciò che di solito significa è che non voglio dilettarti nei certificati X.509 e nel dannato mercato PKI).

Sfortunatamente, il supporto SSL + SRP non è molto diffuso ( GnuTLS è una libreria opensource che conosce SRP).

    
risposta data 15.11.2011 - 21:48
fonte
7

se usi l'hash del client, diventa password del sito e non hai ottenuto nulla.

    
risposta data 15.11.2011 - 21:35
fonte
7

Il modo migliore è utilizzare SSL . Il meccanismo esiste per una ragione. Gli schemi alternativi tendono ad essere insicuri o follemente complessi.

Hai detto che volevi farlo senza usare SSL, ma non hai fornito ragioni o ragioni per cui. Non hai spiegato la situazione in cui ti trovi o cosa giustificherebbe di evitare SSL. Di conseguenza, anche se volessimo fornirti alcuni suggerimenti alternativi, sarebbe impossibile determinare se soddisfano i tuoi requisiti.

    
risposta data 16.11.2011 - 04:26
fonte
3

Se tutto ciò che ti interessa è autenticare l'utente sul server (e non preoccuparti di crittografare i dati successivi), Lampash's Hash sarebbe facile da implementare in quanto esistono già librerie di funzioni hash implementate in Javascript e PHP / ASP / ASP.net.

L'Hash di Lamport è un tipo di schema di password monouso che funziona come segue (Alice è l'utente, Bob è il server):

Registrazione iniziale

Al momento della registrazione, Alice invia [n, hash ^ n (password)] al server (dove hash ^ n è il risultato dell'hashing della password, quindi esegue l'hashing del risultato, quindi esegue l'hashing del risultato, .. ., n volte). Il server memorizza [n, hash ^ n (password)] nel database.

Autenticazione

  1. Alice invia il suo ID (username) a Bob: "Alice"
  2. Bob risponde con "n"
  3. Alice invia x = hash ^ {n-1} (password) a Bob
  4. Bob confronta hash (x) con il digest memorizzato nel suo database
    • Se corrispondono, l'autenticazione ha esito positivo e Bob sostituisce [n, hash ^ n (password)] con [n-1, x = hash ^ {n-1} (password)]
    • Altrimenti, l'autenticazione fallisce e Bob conserva ciò che è nel database

Considerazioni pratiche

  • Molto probabilmente vorrai usare un salt con la password (Bob può inviare il salt in # 2)
  • Una volta che n è abbastanza piccolo, Alice dovrà cambiare la sua password (o possono semplicemente cambiare il sale), e dovrà re-inviare [n, hash ^ n (salt + password)] a Bob
  • Scegli n sufficientemente grande in modo che la registrazione non sia troppo frequente
  • Poiché si tratta di un'autenticazione unidirezionale (l'utente è autenticato sul server, ma il server non è autenticato per l'utente), è possibile utilizzare man-in-the-middle.

Se Lampash's Hash non soddisfa i tuoi requisiti (ad es. hai bisogno dell'autenticazione reciproca), SRP è probabilmente la soluzione migliore, ma nel momento in cui lo hai implementato in Javascript e PHP / ASP / ASP.net, potresti aver noleggiato un server che supporta SSL che è chiaramente la scelta migliore dall'inizio.

    
risposta data 16.11.2011 - 13:51
fonte
2

La risposta è TLS (nemmeno SSL) senza AES come algoritmo di crittografia, poiché esiste un problema noto con la combinazione di TLS, AES e WebSockets, ad esempio. Tutto il resto (come la crittografia della password nel client usando javascript) non è sicuro. Certo, non può essere letto direttamente usando wireshark ma il javascript può provenire da un uomo nel mezzo. quindi prova a convincere la tua scuola? per passare ai server TLS. Questo è il modo più semplice e non richiederà alcuna modifica del codice dell'applicazione.

    
risposta data 16.11.2011 - 13:49
fonte
1

Se è possibile eseguire JavaScript sul client, è possibile impostare uno scambio di chiavi Diffie-Helman o un meccanismo di richiesta / risposta basato sull'hash della password (non memorizzare il testo in chiaro sul proprio sistema!) e utilizzarlo per fare una fantasia processo di autenticazione in cui viene restituita una credenziale crittografata per l'autenticazione.

Questi non fermeranno gli attacchi MITM attivi, ma manterranno gli attaccanti passivi dallo sniffare le password.

    
risposta data 15.11.2011 - 22:40
fonte
1

SSL non può essere infranto come le password in chiaro. Usa SSL. Penso che Scheier abbia qualcosa da dire sulle persone che progettano i propri crittosistemi.

    
risposta data 22.10.2012 - 15:18
fonte
1

I don't like SSL because it's broken.

È un'affermazione piuttosto drammatica da buttare fuori senza spiegazioni né riferimenti di supporto. Intendi tutte le forme di SSL incluso TLS o specificamente SSL v1-3?

È molto meglio di molte altre soluzioni tentate al problema.

L'unico modo per stabilire comunicazioni sicure è tramite la crittografia - e per un client basato su browser, se non stai utilizzando la funzionalità integrata di SSL, allora stai fornendo il codice per implementare la crittografia (sia esso Javascript, activex , java, flash ....) su una connessione non protetta. Quindi il codice può essere compromesso. Non importa se utilizzi rot13 o una chiave a 4096 bit con un algoritmo PFS: se viene gestito da codice consegnato in modo insicuro, modificare il codice per acquisire la password è semplice.

Se pensi che SSL sia rotto, risolvilo: è un modo molto più proficuo per passare il tuo tempo.

    
risposta data 22.10.2012 - 23:32
fonte
0

La prima cosa che controllerei è se il server supporta l'autenticazione http con l'autenticazione digest. Potresti essere in grado di abilitarlo tramite php.

link

Non è sicuro come SSL, ma potrebbe essere un semplice trucco per impedire alle persone della tua classe di sfogliare le tue password. Usa http auth per bloccare l'area del sito che devi proteggere. Vedranno tutto ciò che stai facendo, ma non riceveranno la password di autenticazione http. (otterranno qualsiasi altra password all'interno della sessione)

    
risposta data 22.10.2012 - 22:45
fonte

Leggi altre domande sui tag