Come posso convertire in modo sicuro una password "stringa" su una chiave utilizzata in AES?

20

Sto scrivendo del software in cui devo crittografare tutti i file scritti in una cartella specifica usando AES. C'è una password / chiave che è configurata da qualche parte, che è sempre usata.

Non voglio memorizzare una stringa base64 perché è troppo complicato per la persona che potrebbe dover cambiare la configurazione. Voglio memorizzare una stringa contenente qualsiasi carattere. Qual è il modo migliore per convertire questa password in una chiave da utilizzare in AES?

  • Posso solo ottenere i byte dalla chiave?
  • Dovrei generare una chiave usando PBKDF2?

Come ho capito, ho anche bisogno di fornire un sale. Tuttavia, nella mia situazione il sale sembra non necessario perché ho solo una chiave.

  • Fornisco solo un sale vuoto o è in qualche modo non sicuro?
  • O c'è un modo completamente diverso (si spera più semplice)?
posta Matthijs Wessels 12.07.2013 - 13:30
fonte

3 risposte

33

Quello che fai è il seguente:

  • Genera una chiave lunga, (questo è solo un dato sicuro generato in modo casuale, puoi usare 128 bit)
  • Questa chiave viene utilizzata per crittografare il tuo file con AES (nel senso che lo usi come password)
  • Cifra la chiave stessa con AES usando la tua password (che è un po 'più breve ma più facile da ricordare. Ora AES richiede che questa sia di nuovo 128, 192 o 256 bit di lunghezza, quindi devi fare la tua password di quella lunghezza Quindi puoi semplicemente usare PBKDF2 (o scrypt o bcrypt) per creare una lunghezza della chiave fissa dalla tua password. NON CONSERVARE QUESTO .
  • Tieni un hash della tua password con hash usando PBKDF2 (o bcrypt o scrypt). Ciò ti consentirà di verificare se la password è corretta prima di provare a decodificare la tua chiave crittografata.

hash(hash(password)) --> can be stored
hash(password) --> cannot be stored

È sempre necessario fornire un valore di sale anche se si dispone di una sola chiave (ciò impedisce in gran parte le ricerche nella tabella arcobaleno). Fortunatamente per te, la generazione di sale viene eseguita automaticamente da PBKDF2.

Quindi alla fine hai effettivamente 3 cose:

  • I tuoi file crittografati
  • La tua chiave crittografata
  • Un hash della tua password per verificarlo

Potresti chiederti perché hai bisogno della chiave: se dovessi cambiare la tua password (e avevi crittografato tutti i tuoi file con la tua password), dovresti prima decrittografare tutti i tuoi file con la tua password originale e poi ricodificarli con la tua nuova password. Con questa implementazione tutto ciò che devi fare è decrittografare e ricodificare la chiave (dato che questa chiave funge da password).

Modifica

Ho interpretato male la tua domanda, ho aggiunto la funzione di derivazione della chiave.

Anche a buona lettura (per gentile concessione di IBM)

    
risposta data 12.07.2013 - 13:51
fonte
9

Per convertire una password in un tasto AES, PBKDF2 è il modo più semplice di gestirlo. Assicurati che la password sia sufficiente entropy .

Tu fai devi usare un sale, perché è lì per proteggersi dagli attacchi dei tavoli arcobaleno.

A seconda della tua piattaforma, potrebbero esserci già delle librerie disponibili per aiutarti. Altrimenti, consiglierei qualcosa vicino alla soluzione di Lucus Kaufman.

Configurazione:

  1. Genera una chiave casuale a 128 bit (k1), un casuale IV a 128 bit, e uno casuale salt (64 bit è probabilmente sufficiente).
  2. Utilizza PBKDF2 per generare una chiave a 256 bit dalla tua password e il metodo salt, quindi suddividila in due 128- tasti di scelta rapida (k2, k3).
    • Assicurati che l'output nativo dell'algoritmo sia almeno di 256 bit, altrimenti sarà lento. PBKDF2- SHA256 è una buona scelta. Non usare due algoritmi separati per questo, dal momento che lo renderà più lento e complicato per te, ma non rallenterà l'attaccante.
    • Se la tua password ha già un'entropia sufficientemente alta, allora puoi permetterti di usare un numero piuttosto basso di iterazioni. 1000 iterazioni saranno così rapide che non te ne accorgi nemmeno (soprattutto perché dovrai solo decrittografare la chiave all'avvio del programma), quindi non ci sono molti motivi per andare al di sotto di questo. Se la tua password è più debole, puoi aumentare il numero di iterazioni da compensare.
    • Non consiglio l'uso di bcrypt per questo, dato che l'output è della dimensione sbagliata e avresti bisogno di hash di nuovo, che aggiunge complessità non necessaria.
    • Penso che scrypt possa generare output di dimensioni arbitrarie, quindi sarebbe una buona scelta se fosse disponibile (questo potrebbe non essere consentito se vuoi la FIPS conformità).
  3. Utilizza k2 per AES encrypt k1 utilizzando il IV casuale.
  4. Salva la chiave crittografata, k3, sale e IV in un file da qualche parte.

Crittografia / Decrittografia:

  1. Usa PBKDF2 + la tua password e il sale del file per rigenerare k2 e k3.
  2. Verifica k3. Se non corrisponde, la tua password è sbagliata o qualcuno ha manomesso il tuo file. Fermati qui.
  3. Usa k2 e IV dal file per decodificare k1.
  4. Utilizza k1 per crittografare o decodificare i file.

Modifica password

  1. Decrittografa k1 come nella sezione Crittografia / Decrittografia .
  2. Segui i passaggi di Setup , usando lo stesso k1, ma rigenera tutto il resto (new random salt e IV, generate k2 e k3 dalla nuova password).

Non memorizzare k2 ovunque. Non memorizzare k1 non crittografato. Fare una di queste cose infrange la sicurezza del tuo sistema.

Se non ti interessa essere in grado di cambiare la tua password (considererei questa funzione molto importante, ma forse non lo fai), potresti saltare i passaggi che riguardano k1 e usare k2 come tasto AES e k3 per verificarlo.

Potresti trovare utile anche generare un'altra chiave per HMAC , in modo da poter verificare che i file crittografati non sono stati manomessi Se vuoi farlo, puoi generare una chiave HMAC a 128 bit, e criptarla e memorizzarla con il tasto AES principale.

    
risposta data 12.07.2013 - 19:49
fonte
6

Se generi una chiave dovresti in qualche modo cancellarla, considerando che una funzione di hash è "ordinata" come una pseudo-rng. Quindi usare PBKDF2 è sempre buono, poiché è un metodo di derivazione chiave ed è usato specificamente per questo scopo. Si passa una password e si genera una chiave che è possibile utilizzare in base alla propria password e al sale. Per quanto riguarda Salt, è automaticamente parte di PBKDF2 quindi non dovresti preoccuparti di questo.

Se si utilizza qualcosa come .NET e si memorizza la chiave nel file web.config, è possibile crittografare parti del proprio web.config con la chiave del computer o con una chiave RSA link , la cosa bella di questo è che Windows si occuperà di memorizzare la chiave RSA o la chiave della macchina. Puoi persino automatizzare questo processo con il tuo server di build.

    
risposta data 12.07.2013 - 14:03
fonte

Leggi altre domande sui tag