Ci sono vari altri post che parlano di prendere una chiave da ram come
La mia domanda è un po 'diversa. Supponiamo di avere la chiave e per una breve finestra la useremo per inizializzare una cifra (in questo caso ChaCha20) e quindi cancellare la chiave dalla memoria (usando le migliori pratiche, memset_s ecc.) [* Edit2]
Una volta inizializzato il codice, equivale ad avere la chiave in memoria?
In particolare, guardando il codice di riferimento ChaCha20: link
void ECRYPT_keysetup(ECRYPT_ctx *x,const u8 *k,u32 kbits,u32 ivbits)
{
const char *constants;
x->input[4] = U8TO32_LITTLE(k + 0);
x->input[5] = U8TO32_LITTLE(k + 4);
x->input[6] = U8TO32_LITTLE(k + 8);
x->input[7] = U8TO32_LITTLE(k + 12);
if (kbits == 256) { /* recommended */
k += 16;
constants = sigma;
} else { /* kbits == 128 */
constants = tau;
}
x->input[8] = U8TO32_LITTLE(k + 0);
x->input[9] = U8TO32_LITTLE(k + 4);
x->input[10] = U8TO32_LITTLE(k + 8);
x->input[11] = U8TO32_LITTLE(k + 12);
x->input[0] = U8TO32_LITTLE(constants + 0);
x->input[1] = U8TO32_LITTLE(constants + 4);
x->input[2] = U8TO32_LITTLE(constants + 8);
x->input[3] = U8TO32_LITTLE(constants + 12);
}
Sembra che sia sufficiente richiamare la posizione di memoria puntata da x- > inserire, leggere come 48 byte di dati da quel punto, e ce l'hai.
- È corretto?
- Come può essere impedito nel software? (best practice)
EDIT: Vedo che almeno input [12] e input [13] sono regolati man mano che i byte vengono scricchiolati ... e che il codice può essere "cercato" regolando l'input [8] e input [9] (o almeno in salsa20, suppongo chacha20 sia simile) ... quindi probabilmente sarebbe sufficiente cercare semplicemente una "posizione" casuale e criptare alcuni byte di riempimento casuali, al momento dell'inizializzazione
- È corretto, migliorerebbe la difesa contro l'acquisizione della chiave (o dello stato di inizializzazione)?
EDIT 2:
Credo che la chiave possa essere cancellata dalla memoria una volta che la cifratura è stata inizializzata poiché l'implementazione di riferimento non la usa per la decifratura ... o mi manca qualcosa?
Esempio:
ECRYPT_init();
ECRYPT_keysetup(&ctx, MyKey, ECRYPT_MAXKEYSIZE, ECRYPT_MAXIVSIZE);
ECRYPT_ivsetup(&ctx, MyIv);
//notice neither MyKey nor MyIv are used here:
ECRYPT_decrypt_bytes(&ctx, ciphertext, plaintext, ciphertext_len);