web-dev-qa-db-fra.com

Comment enregistrer la clé secrète en toute sécurité dans Android

Je viens de lire cet article http://Android-developers.blogspot.in/2013/02/using-cryptography-to-store-credentials.html où j'ai appris à générer une clé de sécurité.

Je veux savoir comment enregistrer cette clé générée en toute sécurité afin que les pirates ne l'obtiennent pas, même si le téléphone est enraciné.

Si nous sauvegardons cette SharedPreference, Storage, un pirate informatique pourra l'obtenir.

Merci.

15
N Sharma

C’est le problème général de garder l’accès aux données sensibles. Il existe toujours un moyen de déchiffrer, la clé de chiffrement peut alors fuir.

Vous pouvez utiliser EncryptedPreferences pour stocker des données simples de manière cryptée.

Cependant, un simple coup d'œil dans le code source révèle que vous devez passer un mot de passe sur app init.

EncryptedPreferences encryptedPreferences = new EncryptedPreferences.Builder(this).withEncryptionPassword("password").build();

Ceci est une fuite de sécurité, si le mot de passe est codé en dur. Ce n'est pas la méthode préférée.

Vous pouvez utiliser le lien que vous avez fourni et générer un Pad unique .

public static SecretKey generateKey() throws NoSuchAlgorithmException {
    // Generate a 256-bit key
    final int outputKeyLength = 256;

    SecureRandom secureRandom = new SecureRandom();
    // Do *not* seed secureRandom! Automatically seeded from system entropy.
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(outputKeyLength, secureRandom);
    SecretKey key = keyGenerator.generateKey();
    return key;
}

Bien entendu, une situation idéale est prise en compte, où la fonction de génération de clé est idéalement aléatoire.

Générez cette clé au premier démarrage de l'application et utilisez-la dans la bibliothèque, lien que j'ai fourni auparavant.

Avantage: la clé est différente pour chaque installation d'application. Cela signifie que si le pirate a appris à connaître la méthode de fonctionnement du chiffrement, il ne peut toujours pas déchiffrer d'autres périphériques tant qu'il n'a pas accès à la variable SharedPreferences de ce périphérique.

9
R. Zagórski

si Android est enraciné, il n'y a aucun moyen de sécuriser quoi que ce soit, il est donc préférable de rechercher des modifications architecturales dans votre application.


Exemple: WhatsApp

Lors de l’installation, WhatsApp crée un compte utilisateur en utilisant son numéro de téléphone comme nom d’utilisateur (identifiant Jabber: [numéro de téléphone] @ s.whatsapp.net). Un mot de passe est généré à l'aide d'un algorithme inconnu côté serveur et envoyé au client.

Mais si le téléphone est enraciné, vous pouvez facilement extraire ce mot de passe sous la forme ici .

WhatsApp utilise le cryptage de bout en bout, il stocke toutes ses données sous forme cryptée dans un stockage interne.


Exemple: Snapchat

(Snapchat } _ a déclaré que les Snapchatters utilisant un appareil Rooted Android ne pourront pas se connecter.


Suggestion

Ce que vous pouvez faire est d’utiliser le mélange de techniques des applications géantes WhatsApp et Snapchat i.e

  • Bloquer les téléphones qui sont enracinés
  • Assurez-vous de définir un mot de passe "spécifique à l'utilisateur" (chaque utilisateur a sa propre clé) plutôt que "spécifique à l'application" (identique sur tous les appareils).
  • Enregistrez le mot de passe sur le serveur et récupérez-le à chaque démarrage de l'application (validez et supprimez, ne stockez pas)
  • Assurez-vous que toutes vos données sont sous forme cryptée
2
shanraisshan

Si vous générez et utilisez la clé dans l'application, il peut être intéressant d'utiliser le nouveau (API 18+) Fournisseur de magasin de clés Android . La clé est stockée par un service sécurisé spécial, qui peut utiliser du matériel sécurisé si disponible. 

Il ne stocke pas une clé existante (créée ailleurs), mais vous permet de créer et d'utiliser des clés sans avoir accès à la clé secrète elle-même. L'idée est que la clé secrète ne quitte jamais le service sécurisé, afin que personne ne puisse l'extraire, même votre application (ou la racine, si un matériel sécurisé est utilisé).

Cela vous permet également de limiter l'utilisation de la clé (par exemple, pour une durée déterminée après l'authentification de l'utilisateur).

1
bwt

Règle une de sécurité. N'inventez pas votre propre sécurité. Vous ne pouvez pas créer un moyen de stocker une clé privée en toute sécurité sur un périphérique. Quand vous venez d'apprendre à générer une clé. 

Je viens de lire cet article http://Android-developers.blogspot.in/2013/02/using-cryptography-to-store-credentials.html où j'ai appris à générer une clé de sécurité. 

Une méthode déjà inventée consiste à obliger l'utilisateur à saisir une chaîne (quelque chose qui n'est pas enregistré sur le téléphone) et à utiliser la chaîne pour le cryptage. 

La méthode de chaîne non sauvegardée est facilement cassée en copiant le ROM sur une machine puissante et en utilisant la force brute.

0
danny117

Root utilisateur a la permission de faire n'importe quoi sur votre appareil Android. Quel que soit le lieu où vous enregistrez la clé générée, un processus exécuté en tant que root pourra la lire (à condition qu'il sache où lire). Vous pouvez décider de chiffrer la clé avant de la stocker, mais vous devez ensuite déterminer où vous allez enregistrer la clé de cryptage (là encore, si elle est sur le téléphone, l'utilisateur root peut la lire). 

Vous pouvez envisager de demander à l'utilisateur de votre application de fournir la clé de cryptage et de ne pas stocker la clé de cryptage sur l'appareil. Cependant, même dans ce cas, il pourrait être possible de récupérer cette clé de chiffrement si l'attaquant lui consacrait suffisamment de temps et d'effort. 

Vous devez tenir compte des exigences de votre application. Très probablement, lorsque le périphérique est enraciné, votre application ne doit fournir aucune garantie de sécurité à vos utilisateurs. Après tout, il y a une raison pour laquelle l'enracinement de votre appareil annule la garantie.

0
oldbam