2016-12-08 1 views
1

나는이 솔루션을 어디에서나 검색해 왔지만 아직 작동하지는 못합니다. 내 Google API 키가 res 폴더 안에 문자열로 저장되어 있습니다. 내 프로젝트에서 프로 가드를 활성화하고 속성을 설정 한 다음 나중에 APK를 생성했지만 (부호없는 및 서명 된 모두 시도했지만) 생성 된 APK에 리버스 엔지니어링을 수행 할 수있게되었습니다. Google 키를 다시 (Android Studio 또는 http://www.javadecompilers.com/apktool 사용).ProGuard를 사용하여 Android에서 Google 키를 난독 화하는 방법

Google은 매니지스트에서 API 키를 사용하기 위해 res 폴더에 API 키를 저장하도록 권장하지만 해당 키에 대한 리버스 엔지니어링 보안을 유지하는 방법을 설명하지 않습니다. 내 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 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>; 
}  
을 -optimizationpasses

누군가가이 문제를 해결할 수 있습니까? 나는 정말로 감사 할 것이다. 미리 감사드립니다.

+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 키를 저장하거나 예제에 따라 전체 CREDENTIAL을 저장하는 클라이언트와 다릅니다. 난독 화가 있더라도 ./res/raw에있는 KEY 또는 ./res/raw에있는 CREDENTIAL은 최상의 보안이 아닙니다. –

답변

0

API 키와 같은 문자열 값을 난독 화하려면 ProGuard의 상용 변형 인 DexGuard을 살펴볼 수 있습니다. 자원 값의 인라이닝 및 문자열 암호화를 지원하여 APK의 중요한 데이터를 리버스 엔지니어링하는 것을 훨씬 어렵게 만듭니다.

관련 문제