Prima di tutto, questo NON migliora la sicurezza della tua applicazione (supponendo che sia una webapp).
Usa SSL (o in realtà TLS, che è comunemente chiamato SSL), non è molto costoso (misura il tempo che stai usando per trovare modi per aggirarlo e moltiplicarlo con il salario minimo, l'acquisto di un certificato vince quasi sempre).
Il perché di questo è semplice. TLS risolve un problema (se utilizzato con i certificati acquistati, non autofirmato) che è piuttosto grande nella crittografia: come faccio a sapere se il server con cui sto parlando è il server con cui penso di parlare? I certificati TLS sono un modo per dire: "Io, l'autorità di certificazione, ritenuta attendibile dal tuo browser, certifica che il sito Web su [url] ha questa chiave pubblica, con una chiave privata corrispondente, che (chiave privata) solo il server conosce, guarda Ho firmato la mia firma su tutto il documento, se qualcuno l'ha modificato puoi vedere ".
Senza TLS, qualsiasi crittografia diventa inutile, perché se mi siedo accanto a te in un coffeeshop, posso far pensare al tuo laptop / smartphone che io sia il server e MiTM (Man in The Middle). Con TLS, il tuo laptop / smartphone urlerà "CONNESSIONE NON AFFIDATA", perché non ho un certificato firmato dall'autorità di certificazione che corrisponde al tuo sito. (Crittografia vs. autenticazione).
Disclaimer: gli utenti tendono a cliccare a destra attraverso questi avvertimenti: "connessione non attendibile Quello che voglio solo le mie foto di gattini??! Aggiungi eccezione Clicca Conferma Click YAY! Gattini!"
Tuttavia, se non si desidera acquistare un certificato, implementare comunque l'hashing javascript sul lato client (e utilizzare la libreria standford (SJCL) per questo, NON IMPLEMENTARE MAI CRYPTO ).
Perché? Riutilizzo della password! Posso rubare il tuo cookie di sessione (che mi permette di fingere al tuo server che io sono te) senza HTTPS facilmente (vedi firesheep). Tuttavia, se aggiungi un javascript alla tua pagina di accesso che, prima di inviare, esegue l'hashing della tua password (usa SHA256 o, meglio ancora, usa SHA256, invia loro una chiave pubblica che hai generato e quindi crittografa la password con hash con quella, non puoi usare un salt con questo), quindi invia la password con hash / crittografata al server. RIPRENDI l'hash sul tuo server con un salt e confrontalo con ciò che è archiviato nel tuo database (archivia la password in questo modo:
(SHA256(SHA256(password)+salt))
(salva il sale come testo normale anche nel database)). E invia la tua password in questo modo:
RSA_With_Public_Key(SHA256(password))
e controlla la tua password in questo modo:
if SHA256(RSA_With_Private_Key(SHA256(sent_password))+salt_for_username) == stored_pass: login = ok
Perché, se qualcuno sta annusando il tuo client, sarà in grado di accedere come client (dirottamento della sessione) ma non vedrà MAI la password in chiaro (a meno che non modifichi il tuo javascript, tuttavia, un hacker di Starbucks probabilmente non saprà come / essere interessato in questo.) Così avranno accesso alla tua webapp, ma non alla loro e-mail / facebook / ecc. (per il quale i tuoi utenti probabilmente useranno la stessa password). (L'indirizzo e-mail sarà il loro nome di accesso o sarà trovato nel loro profilo / impostazioni sul tuo webapp).