2016-12-08 8 views
1

Я искал это решение повсюду, но я пока не могу заставить его работать. Мой ключ API Google хранится в строке внутри папки res, я включил proguard в свой проект, установил свойства, позже создав APK (попробовал как без знака, так и подписанный), но все же смог выполнить обратную разработку для моего сгенерированного APK, чтобы получить снова использовать Google Key (с помощью Android Studio или даже http://www.javadecompilers.com/apktool).Как обфускать ключи Google в Android с помощью ProGuard

В своей документации Google рекомендует хранить ключи API в папке res, чтобы использовать его в манифесте, но никогда не объясняет, как помочь с защитой от обратного проектирования на этом ключе.

Мой AndroidManifest.xml имеет этот кусок кода:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.proyecto.cutcsa.cutcsa" > 
    ... 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/app_icon" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     android:name="android.support.multidex.MultiDexApplication"> 

     ... 

     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="@string/google_key" /> 

    ... 
    </application> 

</manifest> 

Мои build.gradle имеет следующий:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "23.0.3" 
    useLibrary 'org.apache.http.legacy' 

    defaultConfig { 
     applicationId "com.proyecto.cutcsa.cutcsa" 
     minSdkVersion 16 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      debuggable false 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 

     debug { 
      debuggable false 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    dexOptions { 
     javaMaxHeapSize "4g" 
    } 
} 
dependencies { 
    ... 
} 

И мой `proguard-rules.pro -optimizationpasses 5

-dontusemixedcaseclassnames  

-dontskipnonpubliclibraryclasses 

-dontpreverify 

-verbose 

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class com.android.vending.licensing.ILicensingService 

-assumenosideeffects class android.util.Log { 
    public static *** d(...); 
    public static *** v(...); 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keep public class * extends android.view.View { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    public void set*(...); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-dontwarn java.awt.** 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
}  

Может кто-нибудь помочь мне с этой проблемой? Я буду очень признателен. Заранее спасибо!

+0

https://github.com/GoogleCloudPlatform/android-docs-samples/blob/master/speech/Speech/app/src/main/java/com/google/cloud/android/speech/AccessTokenLoader.java#L68 как уже отмечалось, ваш дизайн не очень хорош. Вам необходимо разместить процесс, который будет предоставлять токен в ответе, как указано в документах. –

+0

@ Robert Rowntree благодарит вас за ответ. Почему вы говорите, что мой дизайн не очень хорош? Google предлагает работать со своими ключами API таким образом: https://developers.google.com/maps/documentation/android-api/start Кроме того, как образец, который вы разместили в своем комментарии, работает? Как мне это назвать? Как его использовать? С уважением! –

+0

Если у вас есть причина для предупреждения, выпущенного google в кодовой ссылке, вы в порядке. Заметка о предупреждении ... Мобильный клиент, запрашивающий токен доступа с сервера (SECURE), отличается от клиента, который просто хранит либо api-key, либо, как в примере, сохраняет весь CREDENTIAL. Даже при запутывании ключ KEY в ./res/raw или CREDENTIAL в ./res/raw не является лучшей защитой. –

ответ

0

Чтобы обфускать строковые значения (например, ключи API), вы можете взглянуть на DexGuard, который является коммерческим вариантом ProGuard. Он поддерживает встраивание значений ресурсов и шифрования строк, чтобы сделать его гораздо сложнее переконфигурировать конфиденциальные данные из apk.