Come accedere e crittografare i dati con la stessa password / chiave

7

Ho creato un'app Web "vault" in PHP per memorizzare password, numeri di carte di credito, ecc. È principalmente solo per me stesso, ma mi sto esercitando a costruirlo pensando a più utenti. Uso la crittografia bidirezionale per proteggere i dati e voglio che l'utente effettui l'accesso utilizzando la propria chiave (sia una password per accedere che una chiave per i propri dati.)

Ho inizialmente memorizzato il nome utente in testo semplice e la chiave / password in un modo crittografato con un salt. La mia prima preoccupazione è che se qualcuno avesse accesso ai dati SQL, probabilmente avrebbero avuto accesso al mio codice (il mio metodo di sale e crittografia) facendo un lavoro più breve di rivelare la password, quindi potendo accedere ai dati cifrati a due vie con esso .

Inoltre non mi piaceva il nome utente che si trovava lì in chiaro ... sono metà delle informazioni di accesso proprio lì.

Fondamentalmente, sono preoccupato per il login che fornisce informazioni aggiuntive sui dati crittografati.

Qual è la best practice per l'accesso e la crittografia bidirezionale dei dati con la stessa password / chiave?

... e qualcuno sa dove posso saperne di più su questo specifico concetto?

    
posta Joel Mellon 30.10.2012 - 18:42
fonte

3 risposte

12

Prima di tutto, non preoccuparti del nome utente. Il nome utente è supposto essere informazioni pubbliche - se non lo fosse, non sarebbe un nome utente, sarebbe una password. Supponiamo che un utente malintenzionato sia in grado di trovare lo / gli username / i in ogni caso e progetta il tuo sistema in modo da essere sicuro con tale assunto.

In secondo luogo, non preoccuparti del fatto che il metodo di crittografia (o hashing, ecc.) sia pubblico. Questo è principio di Kerckhoff - il metodo di crittografia dovrebbe essere considerato pubblico, l'unica cosa che deve essere segreta dovrebbe essere chiave (o password, in questo caso).

Ci sono molte buone ragioni per questo, non ultimo il fatto che ti permette di pubblicare come funziona il sistema (e quindi convincere i tuoi utenti che è sicuro, o chiedere aiuto agli esperti di sicurezza, o semplicemente usare un esistente sistema standard progettato e analizzato da tali esperti) senza comprometterne la sicurezza.

Terzo, non preoccuparti di salt . Il sale dovrebbe anche essere trattato come (potenzialmente) conoscenza pubblica. Il suo scopo non è quello di fornire alcuna segretezza aggiuntiva, ma di proteggere dagli attacchi utilizzando tabelle hash precompilate assicurandosi che la password di ogni utente venga sottoposta a hash in un modo diverso, anche se le password effettive sono uguali.

OK, quindi che cosa dovrebbe fare ?

Bene, prima di tutto, dovresti utilizzare una funzione di derivazione della chiave sicura che implementa key stretching (e salting, ovviamente) per ricavare la chiave di crittografia dell'utente dalla propria password. PBKDF2 dovrebbe essere utile per questo, sebbene ad es. scrypt potrebbe essere ancora meglio se disponibile.

In secondo luogo, dovresti non ovviamente usare la chiave di crittografia come hash della password. Infatti, non è necessario memorizzare nulla nel database che potrebbe essere utilizzato per ottenere la chiave di crittografia senza conoscere la password. (Ad esempio, la chiave di crittografia non deve essere un hash dell'hash della password.)

Una cosa che potrebbe fare è derivare sia la chiave di crittografia che l'hash della password separatamente dalla password usando PBKDF2, ma sarebbe un po 'inefficiente, dal momento che PBKDF2 è deliberatamente lento. Invece, è possibile ricavare la chiave di crittografia dalla password con PBKDF2 e quindi utilizzare un normale hash crittografico (ad esempio SHA-256) della chiave come hash della password per l'accesso. (Oppure, se si desidera essere più attenti, derivare sia la chiave di crittografia che l'hash della password da una chiave intermedia derivata dalla password che utilizza PBKDF2.)

Infine, per facilitare la modifica della password, non crittografare direttamente i file con la chiave di crittografia dell'utente. Invece, per ogni file, creare una chiave di file casuale, crittografare il file con la chiave del file e crittografare la chiave di file con la chiave di crittografia dell'utente. In questo modo, quando l'utente vuole cambiare la sua password, devi solo crittografare nuovamente le chiavi del file.

    
risposta data 30.10.2012 - 23:05
fonte
2

La serie di blog di Eric Lippert " You voglio Salt With That? "è stato utile per me nella comprensione di diversi problemi relativi alla sicurezza. È stato scritto nel 2005 ma le informazioni continuano ancora oggi.

Puoi anche consultare la Guida all'autenticazione di OWASP e i relativi Scheda Cheat di autenticazione

Quei documenti dovrebbero dimostrarsi utili ma riguardo a What is the best practice for logging in ... Non penso che ci sia una facile risposta in tal senso. Inoltre, non sono un esperto di sicurezza, spero che qualcuno che ne sa di più sia disposto a intervenire e darvi consigli su questo.

    
risposta data 30.10.2012 - 22:55
fonte
0

Uso la password dell'utente come base per la chiave di crittografia e la uso per crittografare una stringa codificata da json delle autorizzazioni dell'utente e archiviarla accanto al loro nome utente.

All'accesso, il nome utente è l'unico campo cercato nel database.

Quando viene restituita una riga corrispondente, i dati crittografati escono dal database e vengono quindi decrittografati con la password. Se questo è valido, viene decodificato e utilizzato - altrimenti la password non è corretta

Modifica

Inoltre potrei aggiungere alcuni dati casuali come JSON, come un salt, e ricodificare e aggiornare nel db per aggiungere un po 'di time-varianza ad esso

    
risposta data 05.01.2018 - 13:46
fonte

Leggi altre domande sui tag