web-dev-qa-db-fra.com

Comment le système Android Keystore peut-il être sécurisé?

J'ai lu la documentation Android dans http://developer.Android.com/training/articles/keystore.html Mais il me manque quelques détails ...

Si une application génère une clé (symétrique ou asymétrique) à l'aide d'AndroidKeyStore.

Pouvons-nous extraire la clé de ce magasin de clés?

Une autre application (AppB) peut-elle accéder à la clé générée par AppA?

Dans quels cas est-il possible de perdre la clé? Réinitialisation d'usine de l'appareil uniquement?

Merci.

22
Anas EL HAJJAJI

Vous pouvez utiliser un fichier normal KeyStore ou le Fournisseur Android KeyStore .

KeyStore (API 1)

Vous devrez créer un fichier KeyStore et vous devrez également gérer le secret pour y accéder. Ce secret est très sensible et difficile à cacher aux attaquants. Personnellement, je préfère déléguer cette responsabilité sur le système Android, et c'est pourquoi je ne choisis pas cette solution sur la suivante.

Fournisseur de clés Android (API 18)

En utilisant cette API, vous déléguerez tout le gros du travail de gestion du fichier et du secret sur Android. Vous n'aurez pas besoin d'utiliser de mot de passe car le système d'exploitation lui-même le stockera dérivant de votre écran de verrouillage PIN, mot de passe, modèle et autres variables).

Si l'appareil contient un matériel sécurisé intégré, la clé y sera stockée (par exemple, Trusted Execution Environment (TEE)) . Vous pouvez vérifier la méthode KeyInfo # isInsideSecureHardware () pour voir si la clé y est enregistrée ou non. Ce mécanisme matériel nous offre une protection supplémentaire au cas où notre application s'exécuterait dans un noyau Linux compromis.

De plus, en commençant par Android 9 (API niveau 28), StrongBox Keymaster l'API a été introduite pour les appareils qui incluent une puce sécurisée (comme Titan M sur Google Pixel 3) . Si vous utilisez Android 28 ou supérieur, il vous suffit d'appeler la méthode setIsStrongBoxBacked (boolean) pour laisser Android = sachez que vous voulez l'utiliser s'il est disponible sur l'appareil. Même si la solution TEE susmentionnée est acceptable, ce mécanisme d'utilisation d'un élément sécurisé (SE) est le plus sûr, car il est basé sur un matériel différent (CPU, mémoire, stockage, etc.) conçu pour des raisons de sécurité.

Ici, nous aurions un exemple rapide de la façon de créer un certificat auto-signé et une paire de clés en utilisant StrongBox si pris en charge:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
        .apply {
            val certBuilder = KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
                .setKeyValidityStart(keyValidityStart)
                .setKeyValidityEnd(keyValidityEnd)
                .setCertificateSerialNumber(BigInteger.valueOf(1L))
                .setCertificateSubject(X500Principal("CN=MyCompany"))

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                initialize(
                    certBuilder
                        .setIsStrongBoxBacked(true) /* Enable StrongBox */
                        .build()
                )
            } else {
                initialize(certBuilder.build())
            }
        }
        .also {
            val keyPair = it.generateKeyPair()
            ...
        }
}

Concernant vos questions:

Pouvons-nous extraire la clé de ce magasin de clés?

Avec les deux, votre application peut obtenir le PrivateKey et l'utiliser si c'est ce que vous voulez dire.

Une autre application (AppB) peut-elle accéder à la clé générée par AppA?

Avec la solution du fournisseur KeyStore, chaque application ne peut accéder qu'à ses instances ou alias KeyStore. Au lieu de cela, en utilisant un KeyStore normal si une autre application a accès au fichier, elle pourrait essayer de l'attaquer.

Dans ce cas, nous pouvons perdre la clé? Réinitialisation d'usine de l'appareil uniquement?

La suppression de l'application effacera l'instance du fournisseur KeyStore de votre application. Cependant, en raison de n méchant bogue de Android (plus courant avant Android 5) si l'utilisateur change le modèle d'écran de verrouillage en un mot de passe ou supprime simplement le modèle, le KeyStore sera entièrement corrompu. La même chose se produit lorsque l'utilisateur effectue une " Effacement des informations d'identification " à partir du Android. Avec le KeyStore classique à la place, vous pouvez le stocker dans le stockage externe et le conserver même après une réinitialisation d'usine de l'appareil. Cependant, comme mentionné précédemment, il est toujours moins sécurisé que le fournisseur.

Je peux me tromper sur certains aspects, mais c'est ce que j'apprends et je viens de partager mon expérience. J'espère que cela vous sera utile.

29
GoRoS