Derivazione di una password di autenticazione da una password di crittografia

1

Sto costruendo un'applicazione con i seguenti requisiti:

  1. Un client accede con e-mail e password. Sul server, bcrypt(password) è calcolato e confrontato con ciò che è memorizzato nel database.
  2. Se l'autenticazione ha esito positivo, il server invia un blocco di dati crittografati che verrà successivamente decrittografato sul client. (Ad un certo punto nel passato, i dati sono stati crittografati dal client e inviati al server.)
  3. La password per i dati crittografati non deve mai essere inviata al server, quindi non posso usare la stessa password per l'autenticazione e la crittografia / decrittografia.

Una soluzione che soddisfi questi requisiti è quella di utilizzare solo due password: una per l'autenticazione e una per la crittografia / decrittografia dei dati. Tuttavia, gli utenti dovranno ricordare due password e potrebbero mescolarle, inviando involontariamente la password di decrittazione al server e violando il terzo requisito.

Un'alternativa che richiede una sola password: utilizzare la password per la crittografia / decrittografia e bcrypt(password) per l'autenticazione. In questo modo, il database memorizzerebbe bcrypt(bcrypt(password)) e il server non gestirà mai la password di crittografia / decrittografia.

È una cosa ragionevole da fare o sto trascurando un problema di sicurezza? Il tempo di calcolo / accesso aggiuntivo causato dal calcolo di due hash non sarebbe un problema.

    
posta chrisklaussner 30.12.2016 - 20:59
fonte

2 risposte

3

La soluzione più appropriata per questo genere di cose è un prefisso.

Ad esempio:

  • Chiave di autenticazione = bcrypt("AUTHENTICATION" + $password)
  • Chiave di crittografia = bcrypt("ENCRYPTION" + $password)

Tuttavia, devo notare che BCrypt non è progettato per generare chiavi crittografiche. È una funzione di hashing della password, non una funzione di derivazione della chiave e le loro proprietà sono diverse. Probabilmente potresti farla franca, ma ti suggerirei di utilizzare PBKDF2 o un KDF simile per generare la chiave di crittografia. A questo punto l'uso di un prefisso è ridondante, poiché stai utilizzando due algoritmi completamente diversi.

    
risposta data 30.12.2016 - 21:40
fonte
0

Lavoro per AgileBits, i creatori di 1Password e descriverò ciò che facciamo per essere all'altezza del nostro nome di 1 password. In realtà ti darò una versione semplificata di esso, perché ci sono altre cose che facciamo nella nostra derivazione della chiave che non è rilevante per questa domanda.

Le due chiavi che i nostri client derivano da una password principale sono qualcosa che chiamiamo una chiave di sblocco principale (MUK) che è la chiave con cui viene crittografata la parte segreta della coppia di chiavi pubblica di un utente. L'altra chiave è l'SRP-x da utilizzare nel protocollo di autenticazione Password remota protetta. Entrambi sono 256 bit.

Iniziamo con due diversi sali, chiamerò un salt_auth e l'altro salt_enc . E abbiamo due diverse stringhe di versione; diciamo che sono "v1-auth" e "v1-enc ".

Per derivare l'SRP-x

quindi ora in molto pseudo codice

deriveKey(salt, password, version, email, accountID)
    s <- HMAC-SHA256(salt, version + username)
    k <- PBKDF2-HMAC-SHA256(password, s, 100000)
    k <- HMAC-SHA256(k, version + accountID)
    return k

Ora non tutti questi passaggi sono necessari. Ma ci sono due differenze nell'input a ciò quando derivano l'SRP-x (per l'autenticazione) o la chiave di sblocco principale (per la crittografia). Il sale e la versione.

(Ci sono altri motivi per cui il nome utente e l'indirizzo e-mail sono vincolanti nella derivazione della chiave che non sono rilevanti per questa discussione. Inoltre usiamo HKDF invece di HMAC-SHA256 in modo da avere qualcosa di più adattabile a diverse dimensioni di chiave.

Usa con cura PBKDF2

Qualunque cosa tu faccia, fai non usa una corsa di PBKDF2 per ottenere due chiavi. Ad esempio, non utilizzare PBKDF2 per generare, ad esempio, una chiave a 256 bit divisa in due chiavi a 128 bit. Cose cattive possono accadere se lo fai.

    
risposta data 01.01.2017 - 00:35
fonte

Leggi altre domande sui tag