2010-12-11 7 views
6

AndroidマーケットライセンスpingサーバーがGRANT_ACCESSポンを返すたびに、ユーザーの認証をキャッシュします。難読化されたキーのキャッシングの脆弱性? Android Licensing

誰にもこの戦略の脆弱性はありますか?私は鍵を難読化しているので、それは非常に強力だと信じています。そして、解読できない唯一の方法は、塩を知ることです。今、誰かがapkを開き、塩を探すことができるかもしれませんが、実際にはクラッキングのレベルではなく、心配することはそれほど重要ではないと思います。

ご覧のとおり、デバイス固有の情報が難読化手法に追加されています。

// Try to use more data here. ANDROID_ID is a single point of attack. 
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
obfuscator = new AESObfuscator(SALT, getPackageName(), deviceId); 
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, obfuscator), BASE64_PUBLIC_KEY); 

次永続データの作成:私はisCachedLicens場合はチェックし、最後に

boolean isCachedLicense() { 
    SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0); 
    if(settings.contains(ACCESS_KEY) && settings.contains(OBFU_ACCESS_KEY)) { 
    String accessKey = settings.getString(ACCESS_KEY, ""); 
    String obAccessKey = settings.getString(OBFU_ACCESS_KEY, ""); 
    try { 
     if(accessKey.equals(obfuscator.unobfuscate(obAccessKey))) { 
       return true; 
     } else { 
       return false; 
     } 
    } catch (ValidationException e) { 
     e.printStackTrace(); 
     return false; 
    } 
    } else { 
     return false; 
    } 
} 

:次に

public void allow() { 
    SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    String uid = UUID.randomUUID().toString(); 
    if(!settings.contains(ACCESS_KEY)) { 
    editor.putString(ACCESS_KEY,uid);  
    editor.commit(); 
    } 
    if(!settings.contains(OBFU_ACCESS_KEY)) { 
    String obfu = obfuscator.obfuscate(uid); 
    editor.putString(OBFU_ACCESS_KEY,obfu); 
    editor.commit(); 
    } 

、私はキャッシュされたコンテンツの状態をチェックするために別の方法を使用しましたeをLicenseCheckerCallback@Override dontAllow@override applicationErrorの次の場所に置き換えます。 isCachedLicenseがtrueの場合は、ユーザーに転送させます。

また、完全なソースコードはhereにあります。

答えて

1

塩による難読化は、一般に弱い戦略です。攻撃者は、あなたが探しているものが分かれば、簡単に実行することができ、アプリケーションに直接アクセスすることなく実行することができます。塩が発見されると(誰でも)、私たちのインストールベースはすべて妥協しました。

固定キー付きの難読化アルゴリズムを使用する代わりに、実績のある暗号化ライブラリ+アルゴリズムを、実行中のユーザーまたはデバイスに固有のキーで使用することをお勧めします。

+0

実績のある暗号化ライブラリを使用しています。参考までに完全なコードを参照してください。 – hunterp

+1

これは一歩進んだことです。ライブラリはまともな仕事をしているようです。攻撃者は各デバイスのデータを別々に解読し、デバイス固有の解読プログラムを実行できるようにデバイスに十分なアクセス権を持たなければなりません。しかし、世界の塩はまだ弱い地点です。そして、これをライブラリとして配布しているように見えるので、エンドユーザーが独自の塩分値を入力しないという危険性があります。確かに、開発者の人口が大きすぎると、入力した値にその値が残ることになります。その値を各デバイスごとに別々に生成された値に変更します。 – blueberryfields

+0

参照を見ると、私はすでにデバイス固有の情報が暗号化ミックスに入っています(私の質問を再編集して、この情報を先頭に追加しました) – hunterp