- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我希望在 Android Marketplace 中使用新的许可 (LVL) 内容,但我遇到了库存 AESObfuscator 的性能问题。具体来说,构造函数需要几秒钟才能在设备上运行(在模拟器上纯粹是痛苦)。由于此代码需要运行以检查缓存的许可证响应,因此它严重阻碍了在启动时检查许可证。
运行 LVL 示例应用程序,这是我对 AESObfuscator 构造函数的野蛮式分析:
public AESObfuscator(byte[] salt, String applicationId, String deviceId) {
Log.w("AESObfuscator", "constructor starting");
try {
Log.w("AESObfuscator", "1");
SecretKeyFactory factory = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM);
Log.w("AESObfuscator", "2");
KeySpec keySpec =
new PBEKeySpec((applicationId + deviceId).toCharArray(), salt, 1024, 256);
Log.w("AESObfuscator", "3");
SecretKey tmp = factory.generateSecret(keySpec);
Log.w("AESObfuscator", "4");
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Log.w("AESObfuscator", "5");
mEncryptor = Cipher.getInstance(CIPHER_ALGORITHM);
Log.w("AESObfuscator", "6");
mEncryptor.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(IV));
Log.w("AESObfuscator", "7");
mDecryptor = Cipher.getInstance(CIPHER_ALGORITHM);
Log.w("AESObfuscator", "8");
mDecryptor.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(IV));
} catch (GeneralSecurityException e) {
// This can't happen on a compatible Android device.
throw new RuntimeException("Invalid environment", e);
}
Log.w("AESObfuscator", "constructor done");
}
Nexus One 上的输出:
09-28 09:29:02.799: INFO/System.out(12377): debugger has settled (1396)
09-28 09:29:02.988: WARN/AESObfuscator(12377): constructor starting
09-28 09:29:02.988: WARN/AESObfuscator(12377): 1
09-28 09:29:02.999: WARN/AESObfuscator(12377): 2
09-28 09:29:02.999: WARN/AESObfuscator(12377): 3
09-28 09:29:09.369: WARN/AESObfuscator(12377): 4
09-28 09:29:09.369: WARN/AESObfuscator(12377): 5
09-28 09:29:10.389: WARN/AESObfuscator(12377): 6
09-28 09:29:10.398: WARN/AESObfuscator(12377): 7
09-28 09:29:10.398: WARN/AESObfuscator(12377): 8
09-28 09:29:10.409: WARN/AESObfuscator(12377): constructor done
09-28 09:29:10.409: WARN/ActivityManager(83): Launch timeout has expired, giving up wake lock!
09-28 09:29:10.458: INFO/LicenseChecker(12377): Binding to licensing service.
7 秒的颠簸(在模拟器中大约 20 秒,呃)。我可以在 AsyncTask 上将它分离出来,但它在那里并没有多大用处,因为在我验证许可证之前,该应用程序无法真正运行。当用户等待我检查许可证时,我得到的只是一个漂亮的 7 秒进度条。
有什么想法吗?使用比 AES 更简单的东西来滚动我自己的混淆器来缓存我自己的许可证响应?
最佳答案
经过大量搜索和修改,我最好的解决方法似乎是自己创建 AES key ,而不是使用 PBEKeySpec 中的 PKCS#5 代码。我有点惊讶其他人没有发布这个问题。
解决方法是将一堆识别数据(设备ID、IMEI、包名等)组合成一个字符串。然后,我采用该字符串的 SHA-1 哈希值来获取 24 字节 AES key 的 20 个字节。诚然,没有像 PKCS#5 那样多的熵,并且已知 key 的 4 个字节。但是,真的,谁会发起加密攻击?它仍然很不错,而且 LVL 中的攻击点要弱得多,尽管我进行了其他强化尝试。
因为即使创建 AES 密码似乎也是一项昂贵的操作(在模拟器上需要 2 秒),我也推迟了加密器和解密器成员的创建,直到调用混淆和去混淆时需要它们。当应用程序使用缓存的许可响应时,它不需要加密器;这从最常见的启动模式中减少了相当多的周期。
我的新构造函数如下。如果有人想要整个源文件,请给我写信。
/**
* @param initialNoise device/app identifier. Use as many sources as possible to
* create this unique identifier.
*/
public PixieObfuscator(String initialNoise) {
try {
// Hash up the initial noise into something smaller:
MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
md.update(initialNoise.getBytes());
byte[] hash = md.digest();
// Allocate a buffer for our actual AES key:
byte[] aesKEY = new byte[AES_KEY_LENGTH];
// Fill it with our lucky byte to take up whatever slack is not filled by hash:
Arrays.fill(aesKEY, LUCKY_BYTE);
// Copy in as much of the hash as we got (should be twenty bytes, take as much as we can):
for (int i = 0; i < hash.length && i < aesKEY.length; i++)
aesKEY[i] = hash[i];
// Now make the damn AES key object:
secret = new SecretKeySpec(aesKEY, "AES");
}
catch (GeneralSecurityException ex) {
throw new RuntimeException("Exception in PixieObfuscator constructor, invalid environment");
}
}
关于android - 使用 LVL 和 AESObfuscator 可以解决糟糕的 SecretKeyFactory 性能问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3814972/
在设置 Android LVL 时,我看到它使用了 AESObfuscator。那么你会使用 Proguard 吗?它们是一起使用还是一个或另一个? 最佳答案 AESObfuscator是 Andro
我在 ServerManagedPolicy 中使用 AESObfuscator 进行 android 许可。到目前为止,我已经像这样创建了 deviceId: String deviceId = S
我正在我的 Android 应用程序中实现许可,并且有一个 20 字节的数组需要传递到传递给 ServerManagedPolicy 对象的 AESObfuscator。这个数组是每次运行代码时随机生
我希望在 Android Marketplace 中使用新的许可 (LVL) 内容,但我遇到了库存 AESObfuscator 的性能问题。具体来说,构造函数需要几秒钟才能在设备上运行(在模拟器上纯粹
我是一名优秀的程序员,十分优秀!