2017-06-16 3 views
0

J'ai une clé API privée dans mon application Android qui est utilisée dans certains domaines - n'y a-t-il aucun moyen d'empêcher un utilisateur d'effectuer une ingénierie inverse ou de décompiler le Java pour voir quelle est cette clé? Est-ce dangereux de placer la clé comme un champ statique dans une classe? Est-il plus sûr de le mettre en tant que ressource de chaîne dans strings.xml? Ou quelque chose d'autre entièrement? Ou n'est-il tout simplement pas possible d'empêcher un utilisateur suffisamment motivé de le trouver?Mon application peut-elle être décompilée pour révéler des constantes de chaîne?

+3

celui-ci: * il n'est tout simplement pas possible d'empêcher un utilisateur suffisamment motivé de le trouver * ... vous pouvez encore obscurcir est en quelque sorte ainsi il ne sera pas disponible juste après la décompilation – Selvin

+1

Possible dupliquer de [Cacher des chaînes dans le code Obfuscated] (https://stackoverflow.com/questions/4427238/hiding-strings-in-obfuscated-code) et [regardez ici] (https://stackoverflow.com/questions/22949801/simple-hiding-obfuscation-of-strings -in-apk) aussi –

+1

@Pavneet_Singh: Bonne trouvaille. –

Répondre

3

Non seulement peut être, ce n'est même pas difficile.

Vous pouvez rendre plus difficile en ne le stockant pas du tout comme une chaîne, mais comme une série de nombres que vous convertissez en chaîne au moment de l'exécution (en l'obscurcissant peut-être).

Mais la réponse à

Ou est-il tout simplement pas possible d'empêcher un utilisateur suffisamment motivé de le trouver?

est: Ce n'est tout simplement pas possible.

+0

Pouvez-vous élaborer un peu plus avec l'exemple "série de nombres"? Je suis d'accord avec l'ajout de quelques couches de protection, même si elle ne s'arrête pas le plus déterminé. Je préfère ne pas être un fruit à portée de main. – KaliMa

+0

@KaliMa: Eh bien, cet exemple particulier serait probablement assez bas. Par exemple, supposons que votre chaîne soit '" bqzT "'. Vous pouvez stocker cela comme 'int a1 = 0x5348e823; int b1 = 0x902b77b2; int c1 = 0xaff50d8b; int d1 = 0x2bf6eacc; int a2 = 0x5348e841; int b2 = 0x902b77c3; int c2 = 0xaff50df1; int d2 = 0x2bf6ea98; 'et le reconstituer avec' String s = new Chaîne (new char [] {(char) (a1^a2), (char) (b1^b2), (char) (c1^c2), (char) (d1^d2)}); 'Encore: Ce n'est pas particulièrement difficile à comprendre, mais la chaîne ne sera pas en texte clair dans votre fichier de classe. :-) –

+0

Donc vous définissez arbitrairement 'a1' et ensuite xor avec le caractère' b' pour obtenir 'int a2'? – KaliMa

-1

Il est préférable d'inclure votre String comme une constante dans un fichier de classe et de l'obfusciter avec String obfuscation et diverses autres techniques en utilisant un obfuscateur gratuit ou commercial. C'est le meilleur que vous pouvez faire et vous serez assez épargner. Vous pouvez vérifier vous-même en décompilant et en essayant de trouver la clé comme si vous ne le saviez pas. Vous verrez à quel point votre protection est bonne.

+0

Avez-vous déjà rencontré [Loi de Schneier] (https://www.schneier.com/blog/archives/2011 /04/schneiers_law.html)? Ne pas être capable de récupérer votre propre secret ne vous dit rien sur le fait que d'autres peuvent le faire. –

+0

@AndyTurner: Si vous passez par les attaques évidentes et il semble sans espoir que vous avez fait un travail décent au moins. Bien sûr, il n'est pas possible de garantir que personne ne réussira jamais, mais certains obfuscateurs sont assez brillants pour déconnecter les sorties de décompilateurs et les goûts – BullyWiiPlaza

+0

Meilleur espoir que ces méchants s'en tenir à l'aide seulement des attaques évidentes! –