1、软件安全的重要性:
只要有程序员在,在源代码可读的情况下,无论多么复杂的系统,总有人可以将其破解。
2、我们应该怎么做:
(1)、使源代码不可读;
(2)、使本地数据不可读;
(3)、使网络数据不可读;
3、Android端具体应该怎么做:
(1)、使源代码不可读(对APP进行加固);
(2)、使本地数据不可读(对本地数据进行加密);
(3)、使网络数据不可读(对网络请求的数据进行加密,返回的数据也需要加密,这需要服务端配合);
4、实例对比:
(2)、使本地数据可读(打开相应的本地文件,查看是否是明文的);
(3)、使网络数据可读(使用Fiddler对网络请求进行查看);
5、对本地数据或网络数据进行加密:
使用JNI技术在SO文件中执行加/解密算法或者生成的加密/解秘钥。
什么是JNI?
(1)、jni是本地开放接口,是一个协议
(2)、java可以调用c/c++
(3)、c/c++可以调用java
6、NDK是什么:
Android NDK是一个让开发人员在Android应用中嵌入使用本地代码编写的组件的工具集。Android应用运行在Dalvik虚拟机中。NDK允许开发人员使用本地代码语言(例如C和C++)实现应用的部分功能。这样以代码重用的形式能够给某类应用提供方便,而且在某些情况下能提高运行速度。
7、配置NDK
(1)、创建jni文件夹
(2)、编写c/c++代码
(3)、打开Project的local.properties文件添加NDK路径
ndk.dir=D\:\\NDK\\android-ndk32-r10-windows-x86_64\\android-ndk-r10
(4)、打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码(注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名)
ndk {
moduleName "so_library"
abiFilters "armeabi"
}
(5)、还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
(6)、生成SO库:
8、使用JNI调用SO文件
(1)、将生成的SO文件拷贝到libs件夹下
(2)、编写JNI Native方法
package com.ndk.jni;
import android.content.Context;
public class JniNative {
static {
System.loadLibrary("so_library");
}
/**
* 请先初始化,否则程序将退出。
* @param context
* @return
*/
public static native String iniJni(Context context);
public static native String getStringFromJNI();
}
(3)、调用JNI Native方法
在需要到的地方调用
JniNative.iniJni(this)
JniNative.getStringFromJNI()