Tecniche per rendere sicura una pagina di accesso senza usare SSL

7

Sto sviluppando una pagina web in cui le persone possono scrivere e commentare cose (non sono richieste informazioni personali) e devo inserire un modulo di accesso in modo che gli utenti possano vedere tutte le loro azioni sulla mia pagina web. La mia idea è di programmare un log in forma senza SSL e consentire anche alle persone di accedere con Facebook se preferiscono. La pagina verrà caricata completamente solo se JavaScript è abilitato.

  1. Il mio primo problema è fare in modo che nessuno possa rubare le credenziali dell'utente agendo come un uomo nel mezzo. Ho pensato di risolverlo con un primo hash sul lato client con JavaScript e poi sul lato server, se ricevo valori hash (nel caso qualcuno cancelli alcuni JavaScript), un secondo hashing e memorizzi i valori hash nel database degli utenti. È un modo sicuro per implementarlo? Inoltre, ci sono possibilità che alcuni dati vengano persi? In tal caso, come posso sapere se i dati ricevuti non sono stati compromessi?

  2. Proteggi dagli attacchi di dizionario e forza bruta. Lo risolveremo contando il numero di tentativi di accesso non riusciti associati a quell'account utente e se è superiore a 8-10 nella riga, mostra un CAPTCHA in ciascuno dei successivi accessi e implementa anche un intervallo di tempo tra successivi tentativi di accesso . Penso che in questo modo le modifiche IP non saranno un problema perché sto contando il numero di accessi non riusciti sul lato server (imposterò una variabile utente in PHP).

  3. Il modulo di accesso. L'ho implementato in questo modo (senza hashing per ora):

    <input id="username" name="userName" placeholder="Username" type="text"> <input id="password" name="pass" placeholder="Password" type="password">

    Ma quando il modulo viene inviato sull'URL posso leggere la password come: /LogIn.php?userName=user&pass=pass Come posso nascondere la password?

Quali potrebbero essere altri buoni consigli, per ottenere la massima sicurezza possibile senza usare SSL?

    
posta user3535688 29.11.2014 - 13:44
fonte

7 risposte

49

Perché ti stai rifiutando di utilizzare TLS? Funziona, ha un buon track record (alcune eccezioni minori a parte). Rifiutarsi di usare buoni strumenti senza una ragione convincente non genera fiducia e non suggerisce immediatamente professionalità.

Inoltre, non eseguire il rollover del proprio sistema di autenticazione. È sciocco, e tu commetterai degli errori. Invece, dal momento che ti aspetti che i tuoi utenti abbiano un account Facebook, usa OAuth2 per consumare identità e autenticazione federate. Ancora meglio, esternalizza questo servizio a un servizio di federazione che lo ha padroneggiato e fornisce anche snippet di codice (viene in mente link ).

Non rendi la tua vita difficile.

    
risposta data 29.11.2014 - 14:39
fonte
18

I certificati SSL / TLS saranno gratuiti entro il Q2 2015. Ottieni il certificato qui:

link

Let's Encrypt offrirà certificati validati dal dominio firmati tramite IdenTrust gratuitamente.

Quando questo è attivo, queste domande dovrebbero essere chiuse, IMHO

    
risposta data 29.11.2014 - 13:55
fonte
12

What could be other good advices, to achieve as much security as I can without using SSL?

Puoi usare TLS invece di fare qualcosa di stupido.

    
risposta data 29.11.2014 - 13:47
fonte
10

Quello che stai cercando di fare è impossibile senza un modo sicuro di inviare i tuoi file al client, come TLS. I tuoi approcci di hashing della password lato client richiedono che il javascript sia inviato in sicurezza al client. Altrimenti, un MITM potrebbe semplicemente servire uno script che non ha cancellato la password, ma invece invia la password di testo chiaro direttamente a loro.

La parte importante è che hai bisogno di codice fidato sul client . Con TLS, quel codice attendibile è il browser, che a sua volta verifica l'integrità del tuo javascript per renderlo affidabile. Senza fare affidamento su questo o qualcosa di equivalente (che non conosco), non puoi fare ipotesi su ciò che viene eseguito sulla macchina del cliente.

    
risposta data 30.11.2014 - 14:19
fonte
3

L'unico modo per essere protetti senza TLS è un plug-in del browser, che deve essere scaricato ... su TLS. E un plugin per il browser è un enorme svantaggio dell'usabilità.

Il motivo è che deve esserci un codice attendibile sul computer dell'utente. Questo può essere il codice TLS nel browser dell'utente o il codice del plugin.

    
risposta data 30.11.2014 - 22:09
fonte
1

Le altre risposte sono chiare - usa SSL

tuttavia, per segnalare cosa fallirebbe se lo implementaste come descritto:

I thought of solving it with a first hashing on client side with JavaScript and then on the server side, if I receive hashed values(in case someone deletes some JavaScript), a second hashing and store those hashed values in the user database. Is it a safe way to implement it? Also, are there any chances that some data get lost? If so how can I know if the received data is not compromised?

quindi in questo scenario un MITM riceverebbe l'hash inviato dal client - se si trattava di un log-in o simile, potevano copiarlo e quindi inviarlo ogni volta che volevano accedere come X. Possibilità di perdita di dati ? con un MITM, è praticamente garantito che alcuni dati possono essere persi - la domanda è che sarete in grado di rilevarlo? quanto a come sai che i dati ricevuti non sono compromessi, il modo tipico sarebbe quello di firmarlo.

Se davvero non devi usare SSL, puoi farlo fuori in sicurezza tramite WS Security invece, ma avvertito, questo sarà più complicato del solo SSL.

Protect from dictionary and brute force attacks.

Generalmente possono essere sconfitti come hai descritto, tuttavia i tempi in cui devi veramente preoccuparti degli attacchi brute-force sono attacchi offline, ovvero quando il tuo codice non è in esecuzione e non puoi proteggere i dati limitando la frequenza di tentativi di accesso - sono necessari molti round di hashing per farlo

The Log In form. I implemented it in this way (without the hashing for now)

quale sarebbe esattamente la differenza per un utente malintenzionato se visualizzasse un URL con hash o un payload con hash degli stessi dati? comunque, se non vuoi i dati nell'URL, usa un POST HTTP invece di un GET HTTP

    
risposta data 29.11.2014 - 17:05
fonte
1

In realtà esiste uno schema di autenticazione "sicuro" sul web che precede l'SSL chiamato autenticazione di accesso digitale , quindi quale chi chiede l'interrogante non è del tutto impossibile. Questo è FAR meno sicuro di SSL ed è soggetto alla forzatura bruta della password attraverso attacchi offline, oltre che all'uso di un vecchio algoritmo hashing di MD5.

Comunque darei comunque lo stesso consiglio di chiunque altro e dirti che SSL è di gran lunga la soluzione migliore rispetto a un sistema basato su una sfida non aggiornata che non è stato aggiornato dal 1993.

    
risposta data 26.12.2014 - 23:16
fonte

Leggi altre domande sui tag