Invia password tramite connessione non protetta

-1

Sto sviluppando un programma che richiede agli utenti di accedere. Il traffico non è sensibile, ma deve viaggiare il più velocemente possibile, quindi non sto proteggendo la connessione tramite TLS o qualcosa del genere. L'unica cosa sensibile è la password e probabilmente il nome utente (che sarà l'indirizzo email). Ho pensato di eseguire il hashing della password sul client prima di trasferirlo o di crittografarlo con una chiave pubblica RSA, il problema è che se un hacker può ottenere questo hash o password crittografata, può facilmente accedere utilizzando questo hash direttamente se modifica il cliente, quindi ho bisogno di una sorta di salatura. Il problema è: il server memorizzerà la password salted + hash, quindi quando il client esegue l'hashing della password con un diverso salt ogni volta, produrrà un hash diverso. Con la crittografia il server può solo decifrare la password + sale e togliere il sale. Ora mi chiedo se c'è un modo senza crittografia, con solo hashing, che posso trasportare la mia password in modo sicuro sul server e proibire a un utente malintenzionato di riutilizzare la password con hash ?

I miei pensieri:

Il server salva la password salata con salt1 , hash. Il server invia salt1 e un random (ogni connessione un nuovo) salt2 al client. Il client salts e hash la password con salt1 , salts e hash l'hash del passaggio 1 di nuovo con salt2 , invia questo hash al server. Quindi per verificare la password il server deve salare e hash è memorizzato hash con salt2 e verificare l'uguaglianza. È sicuro?

    
posta tkausl 17.08.2016 - 00:20
fonte

1 risposta

3

Puoi utilizzare la stessa tecnica dell'autenticazione del digest HTTP (in realtà potresti usare esattamente quella tecnica, riutilizzando una qualsiasi delle varie librerie esistenti).

Il server invia una sfida, il cliente risponde (ad es.) eseguendo l'hashing della sfida e del segreto. Il server si preoccupa di non riutilizzare mai una sfida.

A seconda della meccanica della connessione, potrebbe essere necessario autenticare nuovamente la connessione ad ogni richiesta. Per ridurre il sovraccarico potresti voler utilizzare qualche tipo di nonce incrementale, cioè

client                     server
login request ------>      user's password is "squeamishossifrage"
          <--- 12345       challenge
hash      (MD5("12345:0:squeamishossifrage")
          <--- OK ---
          ---> MD5("12345:1:squeamishossifrage")

Usando HTTP con Digest-Auth questo viene fatto automaticamente. Usando semplicemente HTTP potresti semplicemente aggiungere un'intestazione o un parametro a ciascuna richiesta.

The Server stores the password salted with salt1, hashed. The server sends salt1 and a random (each connection a new) salt2 to the client. The client salts and hashes the password with salt1, salts and hashes the hash from step 1 again with salt2, sends this hash to the server. So to check the password the server has to salt and hash it's stored hash with salt2 and check for equality.

Questo è OK, ma è equivalente alla memorizzazione della password in chiaro. Per tutti gli effetti, conoscere la password salt1-ed è sufficiente per eseguire un login di successo; questo significa che se si dovesse accedere al database delle password, potrebbe usarlo come senza bisogno di decifrare.

Tu fai hai un vantaggio rispetto alla memorizzazione delle password in chiaro, e in questo modo non devi preoccuparti del riutilizzo della password (cioè l'utente usa una password uguale alla sua password per un altro servizio. Chiunque acceda al tuo database ottiene anche l'accesso a questo altro servizio.

    
risposta data 17.08.2016 - 00:31
fonte

Leggi altre domande sui tag