app iOS - hash password utente in-app o on-server?

9

Sto lavorando su un'app iOS che avrà anche un componente web. Quando un utente crea un account, la sua password sarà salata e hash. Ho già l'algoritmo di hash che funziona sul lato web.

Quando un nuovo utente crea un account nell'app, dovrebbe l'app iOS cancellarne la password e inviarla al server per essere inserita direttamente nel database? O la loro password dovrebbe essere inviata al server in testo semplice, e hash lì? Dovrebbe essere codificato in-app, inviato al server, decodificato, quindi hash? Non sono sicuro di quale sia il protocollo migliore e più sicuro. Immagino che la stessa domanda vada per l'autenticazione di un utente esistente che sta tentando di accedere.

Inoltre, a questo punto non ho impostato SSL sul server, ma sono certamente disposto a farlo se è d'aiuto.

    
posta Mike 21.11.2012 - 17:22
fonte

4 risposte

7

Usa SSL per gestire le comunicazioni su Internet in modo sicuro, quindi hash la password sul server. In caso contrario, l'hash della password diventa la password, per quanto riguarda il servizio, e un utente malintenzionato che accede al database può accedere come qualsiasi utente come se le sue password fossero archiviate in testo normale. SSL è fondamentale per impedire che le credenziali degli utenti vengano intercettate sulla rete.

    
risposta data 21.11.2012 - 17:25
fonte
3

Perché non può essere entrambi? Quando l'utente immette la propria password (come un nuovo utente o durante l'accesso), lo hash sul lato client, quindi lo invia su un canale sicuro al server, che lo ripulirà nuovamente prima di fare qualsiasi confronto. Sicurezza ridondante e distribuita; fino a quando l'attaccante non "accende" la macchina su cui è inserita la password in chiaro (utilizzando un keylogger, ecc.), dovrà interrompere più hash / livelli di crittografia e nessun nodo nel sistema sa tutto ciò che è necessario essere noto per ottenere dalla password in chiaro all'hash memorizzato nel DB.

L'hash eseguito sul server dovrebbe essere costoso, come bcrypt o scrypt; quello sul client dovrebbe essere ancora un hash crittografico, ma qualcosa di più veloce come SHA-512 va bene.

    
risposta data 21.11.2012 - 17:54
fonte
0

Il protocollo più sicuro attualmente disponibile riguarda la crittografia a chiave pubblica.

  • genera una chiave privata "server" sul server. La chiave privata non lascia mai il server. In qualche modo ottenere la corrispondente chiave pubblica per l'app. L'utilizzo di HTTPS (TLS) è il modo più comune per gestirlo. In genere, il server Web sysadmin paga circa $ 100 per ottenere la chiave pubblica firmata da un'autorità di certificazione; ma questo non è tecnicamente necessario.
  • genera le chiavi private "dispositivo" localmente nell'app, quando l'app viene eseguita per la prima volta su quel dispositivo. Le chiavi private non abbandonano mai il dispositivo. (La best practice consiste nel generare sia una chiave privata di "firma" che una chiave privata di "crittografia", e quindi chiavi pubbliche derivate da esse). In qualche modo ottenere quelle chiavi pubbliche dall'app al server, forse nel momento in cui l'utente crea un account.
  • Utilizza una sorta di autenticazione reciproca. Mi è stato detto che la parte (opzionale) "autenticazione client" di TLS ("handshake TLS autenticato dal client") è un modo per farlo.

Purtroppo, è un po 'complicato gestire un singolo utente che ha diversi dispositivi (ciascuno con la propria coppia di chiavi privata / pubblica).

    
risposta data 22.11.2012 - 01:18
fonte
0

Sembra che tu stia cercando un protocollo di chiave autenticato dalla password (PAKE). La mia comprensione è che ci sono diverse librerie software che supportano " protocollo di password remoto sicuro " (SRP) o qualche altro PAKE protocollo, incluso GnuTLS , OpenSSL , Castello gonfiabile , e altre implementazioni TLS .

    
risposta data 22.11.2012 - 18:39
fonte

Leggi altre domande sui tag