2010-12-11 55 views
6

每当Android Market Licensing ping服务器返回GRANT_ACCESS pong时,我都会缓存用户的身份验证。混淆密钥缓存中的漏洞? 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); 

下一页创建持久化数据:

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

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

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

回答

1

使用盐进行混​​淆一般来说是一个弱策略。攻击者只需要弄清楚盐分的含量,一旦你知道你在找什么,就很容易做到,而且无需直接访问你的应用程序即可完成。一旦盐被发现(任何人),我们所有的安装基地都已被破坏。

最好的办法是,不要使用带有固定密钥的混淆算法,而要使用经过验证的加密库+算法,该密钥对于用户或正在运行的设备是唯一的。

+0

我确实使用了经过验证的加密库,请参阅完整的代码以供参考。 – hunterp 2010-12-11 02:53:03

+1

这是更好的一步 - 图书馆似乎做了一个体面的工作。攻击者现在必须分别解密每个设备的数据,并有足够的权限访问设备才能运行设备特定的解密器。尽管如此,全球盐仍然是一个弱点。而且,由于它看起来像是将其作为库分发,因此最终用户无法填充自己的盐值会增加危险。可能性是开发人员过多会使其保持您输入的值 - 我会将其更改为每个设备单独生成的值。 – blueberryfields 2010-12-11 04:22:21

+0

如果您查看参考资料,我已经将特定于设备的信息加入到加密组合中(我也重新编辑了我的问题以将此信息包含在顶部) – hunterp 2010-12-11 17:11:17