简单的安卓应用受权认证(JNI)

最近一直在作公司的一个安卓开发框架,含so库,接近尾声了,领导提出一个需求,要求使用这个框架的开发者必须有咱们的受权才能够,可是对方发布的应用后又不能被此受权限制——要否则全部的应用都来要受权那就麻烦了。java

分析:app

既然是限制开发者,那么就必需要区分debug版本和release版本,也就是框架的受权限制功能只对debug版本有效,而对release版本无效;而后就是须要一个调试设备的一个惟一ID,这样受权码是绑定在固定的设备的,只要有新的调试设备就须要新的受权码,通常公司里也就是十几个设备吧,这个申请量级彻底能够接受。框架

思路:jvm

由于正好这个框架须要so库的支持,这样在so库加载时的int JNI_OnLoad(JavaVM* jvm, void* reserved)方法中能够完成验证。this

关于debug和release版本的区分,安卓系统提供了一个debugable属性能够实现,只要是从Eclipse或者ADT的集成环境里直接运行或者调试,均可以判断出是不是debug版本;加密

关于安卓设备的ID,安卓自己提供好几种ID的获取,我最终使用的是security类的ID,   Settings.Secure.getString(ContentResolver,Settings.Secure.ANDROID_ID),这个ID是在安卓设备第一次启动的时候自动生成的,若是刷机的话则可能会改变。spa

受权码的存放位置就放在AndroidManifest中的application结点下,增长一个meta结点,并能够自定义信息的名称,那么如今就是准备工做就全了.debug

实现:调试

1. JNI层的int JNI_OnLoad(JavaVM* jvm, void* reserved)完成验证code

2.JNI层判断程序是否为debug版本,为防止java代码被反编译,因此获取debug属性和判断都在JNI层进行,能够参考java层的以下代码,即将一下代码改编为C++代码:

public  boolean isDebugMode(){
		ApplicationInfo info = this.getApplicationInfo();
		return (0!=((info.flags) & ApplicationInfo.FLAG_DEBUGGABLE));
	}

3.JNI层获取安卓设备的惟一ID,能够参考java代码,即将一下代码改编为C++代码

 String id = Settings.Secure.getString(this.mainActivity.getContentResolver(), 
             Settings.Secure.ANDROID_ID);

4.获取Manifest中的meta中的受权码,这个就不必非得在JNI层实现了,能够在java层获取,而后传递给JNI层,参考是以下的java代码:

ApplicationInfo info=context.getPackageManager().getApplicationInfo(con.getPackageName(),PackageManager.GET_META_DATA);
String key=info.metadata.getString("permissionKey");


5.接下来就是加密解密以及最后的适当加花加壳的取舍了,就再也不细说了。

相关文章
相关标签/搜索