2017-10-17 6 views
2

Je veux protéger certaines chaînes dans mon application Android, il contient des informations qui ne devraient pas être affichées. La meilleure idée que j'ai eu jusqu'ici est de crypter ces chaînes en utilisant un algorithme AES ou quelque chose et de mettre le mot de passe dans un fichier Google Cloud Storage qui ne peut être visualisé qu'avec authentification (par Firebase Auth). ce fichier en cas de besoin. C'est une bonne idée?Protection des cordes dans l'application Android

+0

Je pense qu'il est une bonne idée. Y at-il quelque chose qui vous fait penser que ce n'est pas une bonne idée? –

Répondre

0

J'ai déjà résolu ma question, j'ai ces deux méthodes qui fonctionnent très bien:

public static String encrypt(String message, String key) { 
     String cipherText = null; 

     try { 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES")); 
      byte[] bytes = cipher.doFinal(message.getBytes("UTF-8")); 

      cipherText = Base64.encodeToString(bytes, Base64.DEFAULT); 
     } catch(Exception ex) { 
      ex.printStackTrace(); 
     } 

     return cipherText; 
    } 

    public static String decrypt(String encoded, String key) { 
     String decryptString = null; 

     try { 
      byte[] bytes = Base64.decode(encoded, Base64.DEFAULT); 

      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES")); 
      decryptString = new String(cipher.doFinal(bytes), "UTF-8"); 
     } catch(Exception ex) { 
      ex.printStackTrace(); 
     } 

     return decryptString; 
    } 

Après la méthode Encrypt encrypte le message en AES, il utilise base64 pour rendre l'octet [] dans un lisible Chaîne pouvant être stockée dans un fichier strings.xml ou une classe Java, et la méthode decrypt effectue l'inverse. Et mon application ne récupère la clé qu'en ligne via Firebase Storage.

Maintenant, si quelqu'un essaie de désosser mon code, la seule chose qu'ils peuvent voir est:

<string name="code_1">nuD559T1j8VSqjidiF3Yag==</string> 
    <string name="code_2">+4MTk9TaJJAJEV6D07K++Q==</string> 
    <string name="code_3">4GlPuHyAGhd48bjuSvcvQQ==</string> 
    <string name="code_4">yQnq3/tEIxJe67bhBuzoHw==</string> 
    <string name="code_5">p/sDptvxdi0ynsuybvfI+A==</string> 
    <string name="code_6">dE4aV0wG0aINh/dw0wwevQ==</string> 
    <string name="code_7">vxNaPmHvnbGsydOYXSOSUA==</string> 
    <string name="code_8">fClfcC/Eweh9tA8xz6ktGw==</string> 
    <string name="code_9">FxzAZpH+SJt5Lv6VFU/BEQ==</string> 
    <string name="code_10">qh3jFGHOGMzt50WOwTG4H4Y2Vbr7TzO433tbB3s6P34=</string> 
    <string name="code_11">u7kZjN/bxkMEqDws4nvbnQ==</string> 
    <string name="code_12">Ccf2u8FJGJ1lsiR7aX5OSw==</string> 
    <string name="code_13">E4XsWDHO28pOhV4ter/f2A==</string> 
    <string name="code_14">kgPr+Yz3t4S+Y5zQXjkvJA==</string> 
    <string name="code_15">19CpjUzKOw1fL8bZH8xkMg==</string> 
0

Vous pouvez en référer NDK: Exemple:

#include <string.h> 
#include <jni.h> 

jstring Java_com_riis_sqlndk_MainActivity_invokeNativeFunction(JNIEnv* env, 
jobject javaThis) { 
    return (*env)->NewStringUTF(env, "pass123"); 
} 

Et utiliser dans Android:

public class MainActivity extends Activity { 

    static { 
     System.loadLibrary("sqlndk");       // line 11 
     } 

    private native String invokeNativeFunction();    // line 14 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     String key = invokeNativeFunction();     // line 21 

} 

} 

J'espère que cela peut aider votre problème!

+0

C'est une mauvaise idée, vous pouvez obtenir tous les textes dans les fichiers ".so". –

0

Cela semble être une très bonne idée tant que vous n'avez pas besoin de ces chaînes en mode déconnecté. Sinon, utilisez Keystore.

Plus d'informations: https://developer.android.com/training/articles/keystore.html

Exemple: https://www.androidauthority.com/use-android-keystore-store-passwords-sensitive-information-623779/

En plus Lorsque vous n'avez pas besoin ces valeurs en mode hors-ligne - Vous pouvez enregistrer son dans Keystore et mémoriser la clé à distance que privé ne sont pas toutes les chaînes .