Quanto sono sicure le chiavi hardware-backed in Android, quando le operazioni di crittografia avvengono in memoria?

5

Nel codice di KeyStoreUsage dagli esempi di sviluppatori Android vedo il seguente frammento:

            KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
            ks.load(null);
            KeyStore.Entry entry = ks.getEntry(alias, null);
            if (!(entry instanceof PrivateKeyEntry)) {
                Log.w(TAG, "Not an instance of a PrivateKeyEntry");
                return null;
            }
            Signature s = Signature.getInstance("SHA256withECDSA");
            s.initSign(((PrivateKeyEntry) entry).getPrivateKey());
            s.update(data);
            byte[] signature = s.sign();

Qual è il vantaggio di memorizzare le chiavi nell'hardware, quando tutte le operazioni di crittografia avvengono nella memoria normale? Come ho capito l'architettura di Android le app sono sandboxed in modo che sarebbe sicuro, se il dispositivo non è root. Ma se è rootato la chiave privata non criptata potrebbe essere estratta dalla memoria, giusto?

C'è qualche possibilità nei dispositivi Android (oltre all'utilizzo di UICC o microSD-HSM dedicato) per eseguire tutte le operazioni di crittografia nello stesso hardware in cui sono memorizzate le chiavi, quindi la chiave privata rimane salvata anche se il dispositivo è rootato? / p>

Modifica

Come sembra che ci sia un piccolo malinteso riguardo alla mia domanda, proverò a chiarirlo un po '. Sono ben consapevole che normalmente le chiavi hardware-backed non sono esportabili, ho già lavorato con HSM-Appliance di Utimaco e Luna. Mi sono semplicemente interrogato sulla sicurezza delle chiavi in Android, perché la documentazione non mi è chiara. Da un lato si afferma che le chiavi sono sicure e supportate da hardware (il che significa non estraibili da me), dall'altro trovo frammenti di codice come quello sopra che indicano chiaramente che i tasti sono estraibili . Quindi mi sono chiesto se ho sbagliato tutto e c'è un modo standard (non SEEK) nelle versioni Android più recenti per archiviare le chiavi nell'hardware in modo che non siano estraibili e che l'hardware faccia tutto cripto-operazioni.

EDIT 2

Bene, ora mi sento un po 'sciocco. Dopo aver fatto ulteriori ricerche, ho scoperto che avevo una comprensione molto ristretta di come funzionano le cose (e alcuni fraintendimenti dovuti al fatto che non sono madrelingua). Come Steve ha già detto che gli oggetti PrivateKey sono solo maniglie, non le chiavi stesse. Il fornitore JCE è responsabile di come gestire le chiavi referenziate da queste maniglie. In caso di chiavi hardware-backed i tasti rimarranno nell'hardware e tutte le operazioni che sembrano fatte in memoria (al primo sguardo) saranno delegate all'hardware. Quindi la risposta di Steve è giusta. Per favore, sopportami di aver reso le cose un po 'complicate ...

    
posta Frank 14.11.2016 - 12:06
fonte

1 risposta

5

Potrebbe esserci un malinteso critico qui ...

when all the crypto operations take place in normal memory

Normalmente quando la chiave è memorizzata nell'hardware non può mai essere rimossa dall'hardware, e in quanto tale in realtà non non può essere usata nella memoria normale. Le effettive operazioni di crittografia avvengono in hardware crittografico dedicato.

HAL implementations must not perform any sensitive operations in user space, or even in kernel space. Sensitive operations are delegated to a secure processor reached through some kernel interface. Source

Ciò che offre il codice è semplicemente un'interfaccia astratta per interagire con la chiave. Quello che sta realmente accadendo è che il sistema sta distribuendo le richieste all'hardware crittografico e quindi aspetta solo una risposta.

Detto questo, l'intero sistema non offre alcuna protezione se la chiave viene spostata in memoria per operazioni di crittografia.

    
risposta data 14.11.2016 - 16:26
fonte

Leggi altre domande sui tag