En el código de KeyStoreUsage de las muestras del desarrollador de Android, veo el siguiente fragmento de código:
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();
¿Cuál es el beneficio de almacenar claves en hardware, cuando todas las operaciones criptográficas tienen lugar en la memoria normal? Como entiendo la arquitectura de Android, las aplicaciones están en un espacio aislado, por lo que sería seguro, si el dispositivo no está rooteado. Pero si está enraizado, la clave privada no encriptada podría extraerse de la memoria, ¿no?
¿Hay alguna posibilidad en dispositivos Android (además de usar UICC o microSD-HSM dedicado) para realizar todas las operaciones criptográficas en el mismo hardware donde están almacenadas las claves, por lo que la clave privada permanece a salvo incluso si el dispositivo está rooteado?
EDIT
Como parece que hay un pequeño malentendido con respecto a mi pregunta, intentaré aclararlo un poco. Soy consciente de que normalmente las claves respaldadas por hardware no son exportables, ya he estado trabajando con HSM-Appliances de Utimaco y Luna. Acabo de preguntarme sobre la seguridad de las claves en Android, porque la documentación no está clara para mí. Por un lado, indica que las claves son seguras y están respaldadas por hardware (lo que significa que no es extraíble para mí), por otro lado, encuentro fragmentos de código como el anterior que claramente indican que las claves son extraíbles . Así que me pregunté si las cosas estaban completamente mal y hay una forma estándar (no SEEK) en las nuevas versiones de Android para almacenar las claves en el hardware de manera que no sean extraíbles y deje que el hardware haga todo lo posible. cripto-operaciones.
EDIT 2
Bueno, me siento un poco tonto ahora. Después de investigar más, descubrí que tenía una comprensión muy limitada de cómo funcionan las cosas (y algunos malentendidos debido al hecho de que no soy un hablante nativo). Como Steve ya dijo, los objetos PrivateKey son solo identificadores, no las claves en sí. El proveedor de JCE es responsable de cómo tratar con las claves a las que hacen referencia estos manejadores. En el caso de las claves respaldadas por hardware, las claves permanecerán en el hardware y todas las operaciones que parezcan realizadas en la memoria (a primera vista) se delegarán al hardware. Así que la respuesta de Steve es correcta. Por favor ten paciencia conmigo para hacer las cosas un poco complicadas ...