Algoritmi di crittografia con un codice di errore per la password errata

8

Sto cercando un algoritmo di crittografia che mi consenta di sapere se la password fornita è quella corretta o meno.

Questa domanda può essere considerata come un follow-up per Q . In particolare la risposta di bethlakshmi :

Quando vuoi che il server usi la chiave, suppongo che il processo sia questo:

  1. l'utente dà al sistema la sua password
  2. Il sistema controlla la password, l'hashing e va bene.
  3. il sistema accetta la password (non l'hash!) e sale e calcola la chiave di crittografia
  4. il sistema prende la chiave di crittografia e decodifica la chiave AES

Vorrei fare i passaggi 3 e 4 e dimenticare i punti 1 e 2. Quindi, non voglio memorizzare l'hash della password (o password + sale), quindi non voglio controllare la password per la correttezza come nei passaggi 1 e 2.

Proposta : vorrei calcolare la chiave di crittografia e provare a decodificare la chiave AES. Un modo sarebbe che il tasto AES decriptato una volta con una password valida, quindi può davvero consentire l'autenticazione o ... e nel caso in cui non valido renderebbe fallita l'autenticazione.

  1. Prima domanda: la proposta è considerata una cattiva pratica o no? in caso si cattiva pratica, naturalmente per favore aggiungi il perché?
  2. Torna alla domanda reale: Esiste un metodo di crittografia (con questo intendo il metodo di crittografia utilizzato per crittografare la chiave AES) che restituirebbe un codice di errore se la password fornita non fosse corretta?
posta smiley 15.07.2011 - 11:08
fonte

2 risposte

3

Un buon modo per fare ciò è aggiungere un checksum al messaggio prima della crittografia (in modo da crittografare sia il messaggio che il suo checksum). Ora se l'utente immette una password, puoi provare a decrittografarla e vedere se i dati decrittografati risultanti hanno un checksum valido. Se il checksum non è valido, l'utente ha inserito la propria password in modo errato.

La tua proposta ha una sicurezza più debole. La tua proposta prevede l'archiviazione di Hash (password) in chiaro. Questo è male, perché diventa vulnerabile agli attacchi di precomputazione e agli attacchi di scambio spazio-tempo (ad esempio, le famigerate "tavole arcobaleno" - un tipo specifico di compromesso spazio-tempo, anche se distinto più dal nome colorato che dall'importanza di quello algoritmo particolare). La soluzione che descrivo sopra non ha questo problema.

Attenzione: tieni presente che derivare la chiave da una password o da una passphrase è intrinsecamente debole, perché gli utenti raramente scelgono password o passphrase con sufficiente entropia. (Le password sono assolutamente terribili. Le passphrase sono leggermente migliori, ma tendono comunque ad essere troppo deboli per resistere ad attacchi gravi.) Se la sicurezza è importante, sarebbe meglio evitare di derivare la chiave da una password o da una passphrase. Tuttavia, se è necessario utilizzare la derivazione della chiave basata su password, si consiglia di utilizzare una funzione lenta per derivare la chiave dalla password (ad esempio, bcrypt, PBKDF2), per rallentare gli attacchi di dizionario. Inoltre, non dimenticare di applicare un codice di autenticazione dei messaggi ai dati crittografati.

    
risposta data 15.07.2011 - 18:22
fonte
3

[La tua domanda è un po 'poco chiara per me, ma cercherò di fare un buon lavoro]

OK. Da 3 e 4, vedo che la forza della tua chiave dipende semplicemente dalla forza della password e del sale.

La tua proposta non è male ma non è sicuramente una buona pratica. La ragione è semplice: considera un caso in cui viene inserita la password errata. Come scoprirai che questa è la password sbagliata? Sarà solo gergo e non è possibile scoprire se è il testo in chiaro originale.

Ma ci sono 2 modi per aggirare questo in una certa misura. a) Memorizza l'hash del messaggio originale e confrontalo con l'hash del messaggio decrittografato. Se c'è una mancata corrispondenza, la password è sbagliata. Questo può essere inefficace alla luce delle tavole arcobaleno. Ma salare insieme alle funzioni di hashing unidirezionali può aiutarti a risolvere il problema posto dalla tavola dell'arcobaleno.

b) Nel caso in cui si desideri evitare l'hashing come indicato in 'a', quindi utilizzare un insieme predefinito di caratteri come intestazione e piè di pagina. Il codice deve essere in grado di cercare questo modello nella posizione corretta una volta decodificato. Quindi se questo fallisce, allora la password è sbagliata.

Gli algoritmi di crittografia non generano messaggi di errore. Il tuo codice può essere modificato per introdurre un messaggio di errore se ne hai bisogno.

    
risposta data 15.07.2011 - 13:27
fonte

Leggi altre domande sui tag