之前写过几篇ios加固的文章,感兴趣能够看一下。最近攒了一下收集的一些材料,打算简略写一下安卓加固相干的内容。明天先简略写一篇安卓加固原理的分享。

App会面临的危险

咱们首先理解一下为什么须要加固,尤其是安卓APP,上面是App目前会面临的各种危险:

而通过进行安卓加固,能够升高应用程序蒙受各种歹意攻打的危险,爱护用户数据和应用程序的安全性,加强用户对应用程序的信任度。

安卓加固的原理

安卓应用程序的加固波及多个方面和技术。我列举了一些常见的安卓加固原理以及相干的示例代码:

1. 代码混同(Code Obfuscation):

代码混同通过对利用程序代码进行重命名、删除无用代码、增加虚伪代码等操作,使代码难以浏览和了解,减少逆向工程的难度。罕用的代码混同工具包含ProGuard和DexGuard。

示例代码混同配置(build.gradle):

android {    buildTypes {        release {            minifyEnabled true            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'        }    }}

2. 反调试(Anti-debugging):

反调试技术能够检测应用程序是否在被调试,并采取相应的防护措施,例如中断应用程序的执行、暗藏要害信息等。

示例代码检测调试状态:

import android.os.Debug;if (Debug.isDebuggerConnected()) {    // 应用程序正在被调试,采取相应的措施}

3. 加密和密钥治理(Encryption and Key Management):

加密能够用于爱护应用程序中的敏感数据。对于密钥治理,倡议应用平安的存储形式,例如应用Android Keystore零碎来保留和治理密钥。

示例代码应用AES加密算法对数据进行加密和解密:

import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class EncryptionUtils {    private static final String AES_ALGORITHM = "AES";    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {        SecretKey secretKey = new SecretKeySpec(key, AES_ALGORITHM);        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);        cipher.init(Cipher.ENCRYPT_MODE, secretKey);        return cipher.doFinal(data);    }    public static byte[] decrypt(byte[] encryptedData, byte[] key) throws Exception {        SecretKey secretKey = new SecretKeySpec(key, AES_ALGORITHM);        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);        cipher.init(Cipher.DECRYPT_MODE, secretKey);        return cipher.doFinal(encryptedData);    }}

4. 动静加载和反射(Dynamic Loading and Reflection):

通过动静加载和反射技术,能够将应用程序的外围逻辑和敏感代码进行动静加载和执行,减少逆向工程的难度。

示例代码应用反射加载类和调用办法:

try {    Class<?> clazz = Class.forName("com.example.MyClass");    Object instance = clazz.newInstance();    Method method = clazz.getDeclaredMethod("myMethod");    method.invoke(instance);} catch (Exception e) {    e.printStackTrace();}

5. 平安存储(Secure Storage):

对于敏感数据(如明码、API密钥等),倡议应用平安的存储形式,例如应用Android Keystore零碎或将数据加密后存储在SharedPreferences或数据库中。

示例代码应用Android Keystore存储密钥:

import android.security.keystore.KeyGenParameterSpec;import android.security.keystore.KeyProperties;import java.security.KeyStore;public class KeyStoreUtils {    private static final String KEY_ALIAS = "my_key_alias";    public static void generateKey() {        try {            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");            keyStore.load(null);            if (!keyStore.containsAlias(KEY_ALIAS)) {                KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)                        .setRandomizedEncryptionRequired(false)                        .build();                KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");                keyGenerator.init(spec);                keyGenerator.generateKey();            }        } catch (Exception e) {            e.printStackTrace();        }    }}

以上就是简略的代码示例。

目前市场上加固的形式

目前市面上加固的形式个别是一套纵深进攻体系,别离从代码平安、资源文件平安、数据安全和运行时环境平安维度提供平安爱护。同时针对每个维度又进行了不同档次的划分,加固策略可根据理论场景进行定制化调配,平安和性能达到均衡。

所以个别会从上面几个方面进行加固:

而不同的公司或者APP对于加固的要求又会不一样,所以具体的应用,其实还是要看具体的场景,等之后有机会再开展具体讲一下。

如果加固产品需要,能够戳>>>收费试用