2010-05-09 14 views
5

Quindi sto lavorando a un'applicazione per piattaforme mobili che mi piacerebbe che gli utenti effettuassero l'autenticazione sul Web. Mi stavo chiedendo il modo migliore per fare sicurezza. L'utente sta inviando una password per HTTP a un server php che autentica su un database mysql sullo stesso server. Ovviamente non voglio mandare la password in chiaro su internet, ma non voglio nemmeno fare 2 hash SHA.Invio di password sul Web

Questo è ciò che il server si presenta come (in pseudocodice)

$pass = $_POST['pass']; 

if ((get PASSWORD where USERNAME = USERNAME) == SHA($pass)) return PASS; 

Questo è abbastanza standard e non credo ci sia altro modo per fare questo. Ma mi stavo chiedendo come dovrei preparare i dati prima di inviarli su internet.

risposta

10
  1. Se si vuole la sicurezza, VOI. DOVERE. USO. HTTPS. Con un certificato appropriato, non autofirmato. Qualunque cosa tu faccia, le identità che sono autenticate nella comunicazione non criptata saranno banali da rubare. (Non importa la password, l'utente malintenzionato può semplicemente rubare il cookie di sessione che viene fornito con ogni richiesta.)
  2. L'hashing è inutile di per sé, è necessario saltarlo. (Questo non è realmente correlato all'autenticazione - si tratta di un secondo livello di difesa per il caso in cui qualcuno ruba il tuo database. Probabilmente prima o poi diventerai un obiettivo promettente.) Usa bcrypt con un termine casuale per utente lungo, sha * non è sicuro perché è troppo veloce.
  3. Utilizzare metodi che sono già in uso da parte di progetti grandi e attenti alla sicurezza. Quei metodi hanno, in certa misura, resistito alla prova del tempo. Esistono metodi basati sulla risposta alla sfida che evitano di inviare la password in qualsiasi forma, ma la crittografia è difficile ed è molto semplice implementare algoritmi sicuri in modo non sicuro.Utilizzare un buon quadro di sicurezza (ad esempio PHPass), non fare affidamento su un codice non ampiamente utilizzato.
+0

+1 per una risposta molto più dettagliata della mia. –

+0

Grazie per le risposte ragazzi. Non ho molta esperienza con la programmazione web, immagino sia giunto il momento di approfondire la conoscenza della sicurezza. Ci sono delle guide che possono darmi il quadro generale di come queste tecnologie funzionano insieme? Solo per maggiori informazioni, questo è un programma Android in cui l'utente deve creare un nome utente/password nell'applicazione, e quindi ho intenzione di implementare un'interfaccia web affinché l'utente possa interagire con il telefono. Quindi l'unica volta che la password viene inviata su Internet è la creazione dell'utente. – Falmarri

4

Si potrebbe usare SSL se il client applicazione supporta.

0

Come sottolineato da Pekka, SSL è la soluzione migliore.

In alternativa, l'utilizzo di SHA in JavaScript è abbastanza semplice, veloce ed è già stato scritto. Here's an example ed ecco una libreria: crypto.js

+0

Non è necessario implementarlo da soli. Ci sono ottime librerie che già lo fanno. Ad esempio Crypto.js, l'ho scritto qui: http://techpriester.tumblr.com/post/547863016/crypto-js-by-jeff-mott – selfawaresoup

+0

Giuro su dio c'è una libreria di esempio nel mio link;) Lascia me lo ripeto, quindi è più chiaro. –

0

Per il normale sistema non critico, la maggior parte dei siti Web invia la password in testo normale su Internet durante una richiesta di post http. La password è quindi lato server codificata da SHA1/MD5 e confrontata con il valore nel database.

È inoltre possibile utilizzare https basic authentication, questo codificherà la password con un semplice algoritmo. Ma anche se non invia la password in testo semplice, la codifica è così semplice che è molto (molto!) Facile da decifrare. Tuttavia, utilizzando l'autenticazione di base, non è possibile utilizzare un normale modulo di accesso, sarà necessario fare con il supporto del browser per l'autenticazione di base (non molto facile da usare!).

Se è necessaria maggiore sicurezza, la maggior parte dei siti Web installa semplicemente un certificato SSL lato server acquistato presso un ISP (ad esempio godaddy). Ciò consentirà di accedere allo script di accesso tramite una connessione crittografata SSL. Questa soluzione è considerata sicura (purché la password non sia facile da indovinare o rubare).

Un altro approccio interessante, ma non comune, è eseguire la codifica SHA1 in JavaScript prima di inviare una richiesta (Ajax) al server (JS sha-1 example). In teoria, questo potrebbe fornire una sicurezza abbastanza ragionevole ...

E se tutto ciò non è ancora abbastanza, potresti prendere in considerazione l'installazione di client certificates o un sistema di risposta-sfida con un calcolatore o un SMS.

+3

Non sono d'accordo con la codifica sha1 prima di inviarlo. In questo modo l'hash sha1 agisce semplicemente come password, e chiunque stia fiutando il traffico di rete può semplicemente inviare l'hash al server senza dover conoscere la password originale. Inoltre, ciò rende inaccessibile chi non supporta JS, o significa che il server deve rilevare il tipo di password inviata (hash o hash hash). –

+3

Il server potrebbe inviare il sale, il client potrebbe calcolare l'hash salato, aggiungere una stringa casuale, eseguire nuovamente l'hash, inviare il secondo hash e la stringa casuale e il server potrebbe controllarlo aggiungendo la stringa casuale all'hash della password memorizzata e ancora hashing. È un po 'complicato da eseguire (sono necessarie due richieste di accesso), ma è ragionevolmente sicuro contro un utente malintenzionato che può monitorare la comunicazione ma non può effettuare un attacco man-in-the-middle. Ovviamente, ruberebbe comunque il cookie di sessione. – Tgr

+0

@Tgr: In che modo il secondo hash con la stringa casuale aiuta a rendere le cose più sicure? Se il primo hashing (hash la password + il salt) è vulnerabile a un attacco di replay, il secondo hash non sarebbe di alcuna utilità perché l'utente malintenzionato rigiocerebbe la stessa stringa "casuale". –

Problemi correlati