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 è:
- Genera nuovi / leggi i tasti di firma AES + esistenti
- Cifra i dati utilizzando la prima chiave (AES 256-CBC)
- 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)