之前写过几篇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关于加固的要求又会不一样,所以具体的运用,其实仍是要看具体的场景,等之后有时机再展开具体讲一下。