Application Security delle chiavi crittografiche

0

C'è un modo per proteggere byte[] , PrivateKey , PublicKey , KeyPair e SecretKey in un'applicazione in modo che un malware non sia in grado di recuperare la chiave analizzando la memoria? O almeno, come indurirlo in modo che sia più difficile recuperare le chiavi effimere (nessuna "protezione" usando i tasti codificati per favore)?

O è più o meno un "goner" se l'attaccante ha accesso al dispositivo?

La lingua è Java, quindi supponiamo che l'autore dell'attacco abbia piena conoscenza del codice sorgente.

Senza utilizzare HSM e altri dispositivi simili.

    
posta user3635998 22.03.2016 - 13:45
fonte

1 risposta

2

Non puoi proteggere contro il tuo host, che si tratti del sistema operativo, del processore o del BIOS.
Vedi anche le leggi 1 e 2 della sicurezza.

Questo non significa però che non ci sia modo di difendersi da almeno alcuni attacchi software. Ricorda però che: Se vuoi davvero proteggere la chiave, devi utilizzare tecnologie rinforzate con l'hardware come HSM , TPM , smart card e SGX . I primi due metodi che descriverò sono basilari e sono fatti da ogni libreria crittografica un po 'decente, questi ultimi sono più esotici.

Difesa n. 1: ripulisci sempre dietro di te!

Generalmente è considerata la migliore prassi per ripulire sempre tutto il disastro che si crea nei programmi. Questo vale anche per l'ingegneria della sicurezza e quindi dovresti davvero azzerare in modo affidabile ogni chiave quando non ne hai più bisogno . Tieni presente che un semplice C-style memset(pointer,0,size); non farà il trucco perché il compilatore sicuramente ottimizzerà questo aspetto, dovresti usare le funzioni dedicate per masterizzare le tue chiavi in memoria (Windows le offre e puoi scriverle tu stesso - in assembler o come un semplice ciclo).

Difesa n. 2: non smettere mai di guardare le tue chiavi!

I moderni sistemi operativi vengono comunemente forniti con una funzionalità chiamata "swap-memory", che è ottima per gli sviluppatori di applicazioni, in quanto ciò può aumentare la dimensione della RAM quando necessario scambiando le pagine sul disco rigido. Questo però è davvero dannoso per la sicurezza, perché pulire le chiavi dopo che sono state scambiate tende ad essere piuttosto difficile e quindi dovresti dire al tuo sistema operativo tramite una chiamata di funzione appropriata a tenere sempre le chiavi in (fisico ed effimero) RAM .

Le seguenti difese sono più avanzate ed è meno probabile che vengano schierate ovunque. Tuttavia sono elencati in Schneier's Cryptography Engineering e possono difenderti in alcune circostanze. Lascia che sia l' teryil tinfoil a iniziare!

Difesa n. 3: crittografare tutte le cose!

Potresti aver sentito parlare di "attacchi con avvio a freddo". Fondamentalmente sono lo scenario (improbabile) che un utente malintenzionato possa mettere le mani sul tuo computer, raffreddarlo (più o meno) ed estrarre le chiavi crittografiche segrete per diversi secondi o addirittura ore. È molto difficile difendersi da tali attacchi (che includono anche dump di memoria (automatici)). Ecco perché è stato inventato il Boojum (questo è il nome effettivo!)

Dire, hai le chiavi segrete k,l,m,n , ciascuna di lunghezza 128-bit. Ora crei un'altra chiave segreta i , che utilizzi per crittografare AES k,l,m,n in modalità CTR o GCM (l'autenticazione non conta troppo qui). Ora ogni volta che hai bisogno di k,l,m,n , basta decodificarlo e utilizzarlo, quindi ricodificarlo o cancellare la copia temporanea. La domanda ora diventa "Come proteggere i ?" Con Boojum , crei una stringa casuale R nella RAM in una posizione di memoria fisicamente distante rispetto a i . hash R e XOR con i e memorizzalo. Ogni volta che hai bisogno di i , hai di nuovo hash R e XOR con il valore memorizzato per recuperarlo. Ovviamente questo non è troppo sicuro se si mantiene sempre R lo stesso, poiché la RAM alla fine "impara" il valore e lo mantiene più a lungo, quindi è necessario aggiornare questo spesso . La si aggiorna, selezionando (facoltativamente) una nuova posizione di memoria e generando un nuovo R' e memorizzando R' XOR R nella (nuova) posizione in memoria. Ora smascherate i usando hash di R e cancellate "nuovo" R e mascherate i di nuovo. Ovviamente si elimina il vecchio R . Si consiglia di ripetere questo processo di aggiornamento frequentemente , ad es. ogni secondo.

    
risposta data 23.03.2016 - 17:10
fonte

Leggi altre domande sui tag