Protezione con password di crittografia e chiavi di firma

0

Vorrei archiviare il backup crittografato di file di testo sul mio computer. Sto sviluppando uno script python usando Pycrypto per ottenere ciò, in base al codice this code per utilizzare la libreria. ( codice corrente )

L'idea di base è:

  1. Genera nuovi / leggi i tasti di firma AES + esistenti
  2. Cifra i dati utilizzando la prima chiave (AES 256-CBC)
  3. Firma i dati crittografati utilizzando la seconda chiave con HMAC-SHA256

La generazione di byte per le chiavi è semplicemente il risultato di Random.get_random_bytes(KEY_SIZE + SIG_SIZE) , quindi 64 byte nel mio caso.

Ora, per migliorare la sicurezza, vorrei aggiungere una protezione tramite password alla chiave (se qualcuno trova il file delle chiavi). La mia idea iniziale è di hash salt + password e XOR il risultato con i byte casuali nel file-chiave.

Se uso SHA256 (per essere coerente), significa che emetto 32 byte e dovrei usare XOR due volte (per ogni chiave da 32 byte) e non mi piace (non sono sicuro, ma sembra un potenziale attacco). Usando un sale diverso per ogni chiave?

Infine, c'è un modo standard per memorizzare il sale e le chiavi? Non mi piace l'idea di inventare il mio schema (di solito una cattiva idea in crittografia). Ci sono alcune buone pratiche ?

Aggiornamento: grazie alla risposta del polinomio , ho ricevuto il seguente codice :

from Crypto import Random
from Crypto.Protocol.KDF import PBKDF2

def generate_new_keys(password, enc_key_size=32, sig_key_size=32):
    rand_bytes = Random.get_random_bytes(enc_key_size + sig_key_size)
    # save the salt
    with open('keys.salt','w') as f:
        f.write(rand_bytes.encode("base64").replace("\n",""))
    # derive the two keys using PBKDF2
    enc_key = PBKDF2(password, rand_bytes[:enc_key_size], dkLen=enc_key_size)
    sig_key = PBKDF2(password, rand_bytes[enc_key_size:], dkLen=sig_key_size)
    return (ency_key, sig_key)
    
posta Martin Trigaux 17.12.2012 - 12:05
fonte

1 risposta

5

Non cercare di elaborare il tuo schema di crittografia. Quello che tu proponi è vulnerabile a un attacco in chiaro conosciuto , il che rende banale il materiale chiave da recuperare se qualche bit del i file originali sono noti.

Ad esempio, se so che il primo byte di testo semplice è sempre 0x4B , e posso vedere che il primo byte di testo cifrato è 0xC7 , posso calcolare 0x4B ^ 0xC7 e ottenere il primo byte della chiave , che sarebbe 0x8C . Da lì posso saltare avanti di 32 byte e decodificare quel byte di testo cifrato, e ancora e ancora. Usando queste informazioni potrei scoprire maggiori informazioni sul tuo testo in chiaro e usarlo per decodificare altri dati.

Crittografa il file chiave con un codice a blocchi (ad esempio AES) utilizzando una modalità di operazione appropriata (ad esempio CBC), con una chiave derivata utilizzando un algoritmo di derivazione della chiave appropriato, come PBKDF2. Usare una semplice funzione di hash per la derivazione delle chiavi è una cattiva idea, in quanto è estremamente veloce e consente a un utente malintenzionato di decifrare la password in modo efficiente. Se la tua modalità operativa richiede un vettore di inizializzazione (IV), dovrebbe essere casuale e unica, ma non è informazione segreta.

    
risposta data 17.12.2012 - 12:11
fonte

Leggi altre domande sui tag