行业相关,对安全性较高的程序一般都需要添加完整性检测的功能,以防止程序被篡改,从而导致安全问题的发生。
相关的支付应用项目今年也做了好几个,这些程序也都已通过了行业相关安全标准的认证。
下面来分享Android APP完整性校验的实现思路和代码实现。
通过sp判断当前是否是第一次安装apk,第一次安装默认apk是从市场下载安装,默认认为是没有被篡改过的。可以不用检查,只计算当前的hash值并保存到文件中。
可以在application中执行,计算apk的hash值并写文件的操作是耗时操作,记得开子线程进行。
private boolean integrityCheckResult = false;
private boolean isFirstRun;//可以通过文件保存,例如SP
@Override
public void onCreate() {
super.onCreate();
ThreadPoolManager.getInstance().runInBackground(new Runnable() {
@Override
public void run() {
//检测apk完整性
if (isFirstRun){
//skip and calculate apk’s hash
SecurityManager.getInstance().checkIntegrity(true);
integrityCheckResult = true;
}else {
integrityCheckResult = SecurityManager.getInstance().checkIntegrity(false);
}
}
});
public boolean isIntegrityCheckResult() {
return integrityCheckResult;
}
在入口activity中判断是否完整性校验通过,假如不通过,可以弹窗提示然后锁定APP,让用户重新在安全的平台重新下载安装。当前APP无法使用,存在安全问题。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (App.getApp().isIntegrityCheckResult()) {
Log.d(TAG, "onCreate: checkIntegrity success");
} else {
Log.d(TAG, "onCreate: checkIntegrity failed");
}
}
新建一个安全管理类,用于管理所有和安全相关的类
public class SecurityManager {
//做一个单例
private static SecurityManager instance = null;
private final Integrity integrity;
private SecurityManager(){
integrity = new Integrity();
}
public static synchronized SecurityManager getInstance() {
if (instance == null)
instance = new SecurityManager();