web-dev-qa-db-fra.com

Utilisation de Android Keystore

J'utilise le Android Keystore pour stocker un cryptographique asymétrique (pour décrypter un fichier contenant une clé asymétrique). Je l'ai fait parce que je veux crypter un grand ensemble de données et un isn asymétrique '' t assez et leur magasin de clés a des clés symétriques depuis le SDK 23.

  • Dans HSM classique, vous ne pouvez pas accéder aux clés cryptographiques, vous envoyez uniquement vos données et le HSM effectue les opérations cryptographiques. Mais en Android vous récupérez dans le Keystore la clé pour faire manuellement les opérations (Avec Cipher etc ..) Est-ce sûr?
  • Si ce n'est pas sûr, est-il possible d'effacer les clés de la mémoire après les avoir utilisées? (A la fin de mes fonctions par exemple)
  • Si c'est sûr, quels sont les risques? Avoir le RAM corrompu par un virus?
7
AndoKarim

Jetons un coup d'œil aux Android documents du développeur "Système de magasin de clés Android" . Nous devrons décomposer cela en fonction de la façon dont vous utilisez le KeyStore objet. Si vous utilisez le Android KeyStore KeyStore.getInstance("AndroidKeyStore"), alors:

1) Si l'appareil sur lequel l'application s'exécute dispose d'un stockage sécurisé soutenu par du matériel,

Le matériel de clé peut être lié au matériel sécurisé (par exemple, Trusted Execution Environment (TEE), Secure Element (SE)) du périphérique Android. Lorsque cette fonctionnalité est activée pour une clé, sa clé le matériel n'est jamais exposé à l'extérieur du matériel sécurisé.

L'article "Système de magasin de clés Android" donne plus d'informations sur l'utilisation de cette fonctionnalité.

2) Si l'appareil n'a pas de stockage sécurisé soutenu par du matériel, alors:

Le matériel clé n'entre jamais dans le processus de candidature. Lorsqu'une application effectue des opérations cryptographiques à l'aide d'une clé de magasin de clés Android, en clair, les textes chiffrés et les messages à signer ou à vérifier sont envoyés à un processus système qui exécute les opérations cryptographiques.

Vraisemblablement, ce processus système est écrit en C où ils ont plus de contrôle sur la gestion de la mémoire et peuvent remettre à zéro la clé correctement quand elle sort du cadre de votre application (ce qui m'amène à ma diatribe sur les ramasse-miettes ...)

3) Si pour une raison quelconque vous utilisez KeyStore.getInstance("JKS") comme dans les exemples ici - peut-être avez-vous besoin d'accéder aux clés privées pour une raison quelconque, ou vous devez charger/stocker les clés privées dans un .jks fichier - alors Non, vous ne pouvez pas l'effacer : parce que le Java garbage collector is célèbre pour rendre la mémoire au système d'exploitation sans l'effacer ou la mettre à zéro . D'après les documentation pour les développeurs Android , je ne vois aucune preuve que le garbage collector de Dalvik fonctionne différemment.

De plus, l'un des mécanismes du garbage collector Java est de faire une copie de toute variable de tas actuellement référencée par votre programme, puis de libérer l'ancien tas. Cela signifie qu'une copie de votre La clé peut être libérée dans le système d'exploitation avant même qu'elle ne soit hors de portée.


Conclusion: Si l'objet Android KeyStore est utilisé correctement, vos clés privées resteront en sécurité à l'intérieur de Trusted Execution Environment (TEE), Secure Element (SE)) ou Processus système.

Si, pour une raison quelconque, vous apportez la clé privée dans votre application, tous les paris sont désactivés car dans Java/Dalvik/Android, une fois que quelque chose est dans la mémoire de votre application, il est presque impossible d'effacer ou le mettre à zéro.

8
Mike Ounsworth

Les autres réponses couvrent assez bien tout, mais un aspect semble être mal compris. Comme les autres réponses citées, ...

Le matériel clé n'entre jamais dans le processus de candidature. Lorsqu'une application effectue des opérations cryptographiques à l'aide d'une clé de magasin de clés Android, en clair, les textes chiffrés et les messages à signer ou à vérifier sont envoyés à un processus système qui exécute les opérations cryptographiques.

Cela signifie qu'une application Android Android ne peut récupérer aucun des octets de la clé par tout moyen pris en charge. Cette application est possible car Android (et Java) accéder à la clé brute via une seule méthode, Key.getEncoded() , dans l'interface Key . Pour les clés gérées par le magasin de clés Android, Key.getEncoded() renvoie null.

Si vous avez vraiment besoin d'importer des données de clés dans AndroidKeyStore (par exemple, vous devez effectuer avec lui des opérations que le magasin de clés ne prend pas en charge), il n'est pas immédiatement évident de savoir comment s'assurer qu'elles ne restent pas dans la mémoire de l'application. Cependant, j'ai joué avec cela moi-même et il semble que vous soyez assez en sécurité si vous faites ce qui suit:

  • Assurez-vous que vos données clés ne sont stockées que dans un byte[] ou similaire (pas un String ou un autre objet pouvant copier ses données).
  • Implémentez votre propre classe * KeySpec qui ne fait aucune copie des données (celles par défaut le font, et il n'y a aucun moyen simple d'effacer les données copiées car elles sont privées)
  • Remplacez le byte[] en maintenant les données clés dès qu'elles sont placées dans le magasin de clés.
  • Le bit clé: stockez immédiatement UNE AUTRE entrée fictive dans le magasin de clés en utilisant zéro ou des données indésirables. Cela semble être le seul moyen d'effacer la copie qui est faite lors de la parcellisation des données à envoyer via RPC au service de magasin de clés.

J'espère que cela t'aides.

0
Dylan Nicholson