programacion - ¿Cómo puede ser seguro el sistema Android Keystore?
programacion android pdf 2018 (1)
Leí la documentación de Android en http://developer.android.com/training/articles/keystore.html Pero me faltan algunos detalles ...
Si una aplicación genera una Clave (simétrica o asimétrica) usando AndroidKeyStore.
¿Podemos extraer la clave de ese almacén de claves?
¿Puede otra aplicación (AppB) acceder a la clave generada por AppA?
¿En qué casos es posible perder la llave? ¿Restablecimiento de fábrica del dispositivo solamente?
Gracias.
Puede utilizar un archivo normal de KeyStore o el proveedor de Android KeyStore .
KeyStore (API 1)
Tendrá que crear un archivo de KeyStore y también tendrá que administrar el secreto para acceder a él. Este secreto es muy sensible y difícil de ocultar de los atacantes. Personalmente, prefiero delegar esa responsabilidad en el sistema Android, y es por eso que no elijo esta solución en la siguiente.
Proveedor de KeyStore de Android (API 18)
Usando este API, delegará todo el trabajo pesado de administrar el archivo y el secreto en Android. No tendrá que usar ninguna contraseña, ya que el propio sistema operativo la almacenará a partir de su código PIN de bloqueo de pantalla, contraseña, patrón y otras variables.
Si el dispositivo contiene un hardware seguro integrado, la clave se almacenará allí (por ejemplo, Trusted Execution Environment (TEE)) . Puede verificar KeyInfo#isInsideSecureHardware() método KeyInfo#isInsideSecureHardware() para ver si la clave está guardada allí o no. Este mecanismo de hardware nos brinda una protección adicional en caso de que nuestra aplicación se esté ejecutando en un kernel de Linux comprometido.
Además, a partir de Android 9 (nivel de API 28), se introdujo StrongBox Keymaster API para aquellos dispositivos que incluyen un chip seguro (como Titan M en Google Pixel 3). Si está ejecutando en Android 28 o superior, solo necesita invocar el setIsStrongBoxBacked(boolean) para que Android sepa que desea usarlo si está disponible en el dispositivo. Aunque la solución TEE mencionada anteriormente es aceptable, este mecanismo de uso de un Elemento seguro (SE) es el más seguro, ya que se basa en un hardware diferente (CPU, memoria, almacenamiento, etc.) diseñado para fines de seguridad.
Aquí tendríamos un ejemplo rápido de cómo crear un certificado autofirmado y un par de claves utilizando StrongBox si es compatible:
KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
initialize(
KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
.setKeyValidityStart(keyValidityStart)
.setKeyValidityEnd(keyValidityEnd)
.setCertificateSerialNumber(BigInteger.valueOf(1L))
.setCertificateSubject(X500Principal("CN=MyCompany"))
.setIsStrongBoxBacked(true) /* Enable StrongBox */
.build()
)
} else {
initialize(
KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
.setKeyValidityStart(keyValidityStart)
.setKeyValidityEnd(keyValidityEnd)
.setCertificateSerialNumber(BigInteger.valueOf(1L))
.setCertificateSubject(X500Principal("CN=MyCompany"))
.build()
)
}
}
.also {
val keyPair = it.generateKeyPair()
}
Con respecto a sus preguntas:
¿Podemos extraer la clave de ese KeyStore?
Con ambos, su aplicación puede obtener el PrivateKey y usarlo si esto es lo que quiere decir.
¿Puede otra aplicación (AppB) acceder a la clave generada por AppA?
Con la solución del proveedor de KeyStore, cada aplicación solo puede acceder a sus instancias o alias de KeyStore. En su lugar, utilizando un KeyStore normal si otra aplicación tiene acceso al archivo, podría intentar atacarlo.
¿En qué caso podemos perder la llave? ¿Restablecimiento de fábrica del dispositivo solamente?
Al eliminar la aplicación, se borrará la instancia del proveedor KeyStore de su aplicación. Sin embargo, debido a un error desagradable de Android (más común antes de Android 5) si el usuario cambia el patrón de bloqueo de la pantalla en una contraseña o simplemente elimina el patrón, el KeyStore estará completamente dañado. Lo mismo sucede cuando el usuario realiza un " Borrar credenciales " de la configuración de Android. En cambio, con el clásico KeyStore, puede almacenarlo en el almacenamiento externo y conservarlo incluso después de un restablecimiento de fábrica del dispositivo. Sin embargo, como se mencionó anteriormente, todavía es menos seguro que el proveedor.
Puede que me equivoque en algunos aspectos, pero esto es lo que aprendí y acabo de compartir mi experiencia. Espero que esto te ayude.