7

每当 Android Market Licensing ping 服务器返回 GRANT_ACCESS pong 时,我都会缓存用户的身份验证。

有人看到这种策略有任何漏洞吗?我相信它非常强大,因为我正在混淆一个密钥,而解开混淆的唯一方法是知道盐。现在,可以想象有人可以打开 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 ); 

接下来创建持久数据:

 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();
   }

然后,我使用了另一种方法来检查缓存内容的状态:

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;
  }
} 

最后,我检查了isCachedLicense 是否在LicenseCheckerCallback: @Override dontAllow和. 的以下位置@override applicationError。如果isCachedLicense是真的,那么我让用户转发。

此外,完整的源代码位于此处

4

1 回答 1

1

用盐进行混​​淆通常是一种弱策略。攻击者只需要找出盐,一旦你知道你在寻找什么,这是相当直接的,并且可以在不直接访问你的应用程序的情况下完成。一旦(任何人)发现了盐,我们所有的安装基础都受到了损害。

您最好的选择是,不要使用具有固定密钥的混淆算法,而是使用经过验证的加密库+算法以及对用户或您正在运行的设备唯一的密钥。

于 2010-12-11T01:11:18.160 回答