Cosa hashing / crittografia da utilizzare per la stringa condivisa pubblicamente corrispondente a un codice segreto

1

Sto cercando il modo senza database per convalidare un codice segreto che è stato inviato al cellulare dell'utente dall'app web RESTful, in un processo di autenticazione a 2 fattori.

Al punto 1, l'utente fornisce nome utente e password che vengono convalidati con i dati dal database. Ora il sistema genera un codice che viene inviato al telefono dell'utente. Per comodità, il codice dovrebbe essere relativamente semplice, diciamo 5 cifre numeriche. L'utente deve fornire questo codice per completare il processo di autenticazione.

Vorrei evitare il più possibile gli accessi al database, quindi utilizzo JWT per mantenere lo stato. Ma sarebbe assurdo archiviare il codice di autenticazione segreta nel JWT, perché può essere facilmente estratto dal lato client. Pertanto, dovrebbe essere archiviato in formato hash o crittografato. Sto considerando di salare il codice segreto con sale strong (noto solo dal server) e quindi memorizzare l'hash SHA256 del risultato (hash bcrypt non va bene qui perché contiene il sale). Ciò renderebbe il codice segreto nascosto da qualsiasi sguardi indiscreti, ma comunque utile per convalidare il codice se fornito da qualcuno che lo conosce. E il server può tranquillamente dimenticare il codice nel frattempo.

Questo approccio può essere considerato sicuro per lo scopo prefissato?

    
posta Passiday 12.03.2017 - 16:18
fonte

2 risposte

1

Stai cercando i codici di autenticazione dei messaggi, non puro hashing. Probabilmente potresti fare qualcosa di simile al seguente:

Il server genera un codice. Mantiene anche un segreto (in pratica è ciò che intendevi per il tuo sale segreto). Quindi calcola

mac = hmac-sha256(code, secret)

mac è memorizzato nel tuo jwt. Quando l'utente inserisce il suo codice, il server lo utilizza e secret solo il server sa calcolare mac2 , e se mac2 corrisponde a mac , l'utente ha inserito il codice corretto.

Modifica: hai giustamente sottolineato che questo può essere sfruttato perché lo stesso codice produce sempre lo stesso mac. Quindi puoi correggere questo problema in questo modo:

mac = hmac-sha256(code || salt, secret)

Ora devi memorizzare salt insieme a mac nel tuo jwt. Scegli un nuovo% casualesalt ogni volta che generi un nuovo Mac. Penso che la costruzione di cui sopra sia sicura, ma potresti volere un po 'di google per assicurarti.

HMAC è un protocollo da utilizzare per generare codici di autenticazione dei messaggi (mac), vedere Wikipedia per ulteriori informazioni. La maggior parte dei linguaggi di programmazione offre una libreria per lavorare con HMACs.

    
risposta data 12.03.2017 - 17:16
fonte
0

Ho difficoltà a vedere come funziona in alcun modo, ti prego di sopportare me.

Abbiamo a che fare con un secondo fattore di autenticazione, quindi lavoriamo sul presupposto che sia effettivamente necessario; in altre parole, il primo fattore è stato compromesso.

Ecco cosa faccio come hacker.

  1. Ho impostato il mio account
  2. Accedo alla tua app
  3. Ricevo un codice 2FA e JWT che è salato e firmato come suggerito. Ora ho una JWT e il codice che lo accompagna.
  4. Ora provo ad accedere al TUO account usando le tue credenziali compromesse
  5. Il sistema invia il codice 2FA all'utente, quindi non lo ricevo effettivamente e non ho idea di quale sia il codice.
  6. Ho ancora il JWT e il codice del passaggio 3, quindi lo uso.

In che modo questo è in qualche modo sicuro? Deve esserci qualcosa che lega il codice all'utente.

    
risposta data 12.03.2017 - 23:03
fonte

Leggi altre domande sui tag