本发明涉及安全、签名认证技术领域,尤其涉及一种安卓APP签名绑定方法及装置。
背景技术:
在软件App开发大环境中,存在着逆向工程与安全方向。若反编译开发的App,再加上新的签名重新编译,就可发布一个一样的App。因此提高自有App的安全性成为其中的一项重要技术。
现有技术中,通过在App中的java层代码中加入自有的数字签名来实现签名认证。在App被非法开发者破解并重新加入新的签名时,App中的java层代码自动判断App的数字签名与加入的自有签名是否一致,从而达到保护自有App的作用。但是,Java层代码的安全性不高,非法开发者很容易通过反编译找到加入到App的自有数字签名数据,从而对其进行修改,实现签名认证。
技术实现要素:
本发明针对现有技术中存在的问题,提供了一种安卓APP签名绑定方法及装置,能够提高签名被破解的难度,有效提高APP的安全性,防止修改App的数字签名。
本发明就上述技术问题而提出的技术方案如下:
一方面,本发明提供一种安卓APP签名绑定方法,包括:
将软件APP与其自有正确的数字签名信息进行绑定;
每次启动所述APP时,通过所述APP中的Java层代码调用由C语言编写的数字签名认证程序,获得当前数字签名数据;
将所述当前数字签名数据与绑定的数字签名信息进行对比;
根据对比结果判断所述APP签名是否认证成功。
进一步地,所述根据对比结果判断所述APP签名是否认证成功,具体包括:
若所述当前数字签名数据与绑定的数字签名信息相一致,则判定所述APP签名认证成功,继续运行所述APP;
若所述当前数字签名数据与绑定的数字签名信息不一致,则判定所述APP签名认证失败,停止运行所述APP。
进一步地,所述将软件APP与其自有正确的数字签名信息进行绑定,具体包括:
通过Java层代码将所述APP自有正确的数字签名数据放入C语言代码中,获得数字签名信息,以将所述APP与所述数字签名信息进行绑定。
进一步地,所述通过Java层代码将所述APP的数字签名数据放入C语言代码中,获得数字签名信息,具体包括:
通过包管理器获得指定包名的包信息;所述包信息包括签名;
通过所述包信息获得签名数组;
获取所述签名数组的第一个数字签名数据,并将所述数字签名数据放入C语言代码中,获得所述数字签名信息。
进一步地,所述由C语言编写的数字签名认证程序的运行方法包括:
获取所述APP的包管理器;
通过所述包管理器获得指定包名的包信息;所述包信息包括签名;
通过所述包信息获得签名数组;
获取所述签名数组的第一个数字签名数据,作为当前数字签名数据。
另一方面,本发明提供一种安卓APP签名绑定装置,包括:
绑定模块,用于将软件APP与其自有正确的数字签名信息进行绑定;
调用模块,用于每次启动所述APP时,通过所述APP中的Java层代码调用由C语言编写的数字签名认证程序,获得当前数字签名数据;
对比模块,用于将所述当前数字签名数据与绑定的数字签名信息进行对比;以及,
运行判断模块,用于根据对比结果判断所述APP签名是否认证成功。
进一步地,所述运行判断模块具体包括:
继续运行单元,用于在所述当前数字签名数据与绑定的数字签名信息相一致时,判定所述APP签名认证成功,继续运行所述APP;以及,
停止运行单元,用于在所述当前数字签名数据与绑定的数字签名信息不一致时,判定所述APP签名认证失败,停止运行所述APP。
进一步地,所述绑定模块具体用于:
通过Java层代码将所述APP自有正确的数字签名数据放入C语言代码中,获得数字签名信息,以将所述APP与所述数字签名信息进行绑定。
进一步地,所述绑定模块具体包括:
包信息获取单元,用于通过包管理器获得指定包名的包信息;所述包信息包括签名;
签名数组获取单元,用于通过所述包信息获得签名数组;以及,
信息获取单元,用于获取所述签名数组的第一个数字签名数据,并将所述数字签名数据放入C语言代码中,获得所述数字签名信息。
进一步地,所述由C语言编写的数字签名认证程序的运行方法包括:
获取所述APP的包管理器;
通过所述包管理器获得指定包名的包信息;所述包信息包括签名;
通过所述包信息获得签名数组;
获取所述签名数组的第一个数字签名数据,作为当前数字签名数据。
本发明实施例提供的技术方案带来的有益效果是:
在每次启动APP时,通过Java层代码调用由C语言编写的数字签名认证程序,获得当前数字签名数据,以与预先存储的数字签名信息进行对比,实现对APP签名的认证,提高签名被破解的难度,提高安全性,更好地保护APP不被非法冒充。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一提供的安卓APP签名绑定方法的流程示意图;
图2是本发明实施例一提供的安卓APP签名绑定方法的具体流程示意图;
图3是本发明实施例二提供的安卓APP签名绑定装置的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例一
本发明实施例提供了一种安卓APP签名绑定方法,参见图1,该方法包括:
S1、将软件APP与其自有正确的数字签名信息进行绑定;
S2、每次启动所述APP时,通过所述APP中的Java层代码调用由C语言编写的数字签名认证程序,获得当前数字签名数据;
S3、将所述当前数字签名数据与绑定的数字签名信息进行对比;
S4、根据对比结果判断所述APP签名是否认证成功。
需要说明的是,通过通用方法把签名相关(即数字签名认证程序)的C语言代码打包成.so库文件:l iblocSDK7.so,并建立JNI调用关系(Java层代码调用C语言代码必须通过JNI的调用方式)。
在每次启动APP时,APP中的Java层代码通过JNI调用C语言中的数字签名程序verifySign(),即可获得当前数字签名数据s ign,将当前数字签名数据sign与预先存储的数字签名信息SIGN进行对比:
int result=strcmp(sign,SIGN)。
采用DeleteLocalRef方法对C语言的内存释放,并判断result返回结果,若返回0,则表示签名一致,反之,则表示签名不一致。本实施列采用so库的方式,使得逆向工程师只能反翻译到二进制的数据或者汇编式语言,从而有效提高签名的破解难度,提高APP安全性,更好地保护APP不被非法冒充。
进一步地,在步骤S3中,所述根据对比结果判断所述APP签名是否认证成功,具体包括:
若所述当前数字签名数据与绑定的数字签名信息相一致,则判定所述APP签名认证成功,正常运行所述APP;
若所述当前数字签名数据与绑定的数字签名信息不一致,则判定所述APP签名认证失败,停止运行所述APP。
需要说明的是,若签名一致,则正常运行APP,反之,则APP停止运行,即调用杀死程序Java代码:
android.os.Process.killProcess(android.os.Process.myPid())。
进一步地,所述将软件APP与其自有正确的数字签名信息进行绑定,具体包括:
通过Java层代码将所述APP自有正确的数字签名数据放入C语言代码中,获得数字签名信息,以将所述APP与所述数字签名信息进行绑定。
进一步地,所述通过Java层代码将所述APP的数字签名数据放入C语言代码中,获得数字签名信息,具体包括:
通过包管理器获得指定包名的包信息;所述包信息包括签名;
通过所述包信息获得签名数组;
获取所述签名数组的第一个数字签名数据,并将所述数字签名数据放入C语言代码中,获得所述数字签名信息。
具体地,通过Java把APP正确的数字签名数据放入到C语言代码中:
(1)通过包管理器获得指定包名包含签名的包信息
PackageInfopackageInfo=
context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES);
(2)通过返回的包信息获得签名数组
Signature[]signatures=packageInfo.signature;
(3)根据返回签名数组获取第一个的数字签名数据
数字签名数据=signatures[0].toCharsString();
(4)放入到C语言代码中
static const char*SIGN="数字签名信息"。
进一步地,所述由C语言编写的数字签名认证程序的运行方法包括:
获取所述APP的包管理器;
通过所述包管理器获得指定包名的包信息;所述包信息包括签名;
通过所述包信息获得签名数组;
获取所述签名数组的第一个数字签名数据,作为当前数字签名数据。
具体地,用C语言编写数字签名认证方法:
(1)获取APP的application
jobject application=NULL;
jclass activity_thread_clz=env->FindClass("android/app/ActivityThread");
jmethodID currentApplication=env->GetStaticMethodID(activity_thread_clz,"currentApplication","()Landroid/app/Application;");
Jobjectapplication=
env->CallStaticObjectMethod(activity_thread_clz,currentApplication);
(2)通过APP的application获取包管理器
jclass context_clz=env->GetObjectClass(applicat ion);
jmethodID getPackageManager=
env->GetMethodID(context_clz,"getPackageManager",
"()Landroid/content/pm/PackageManager;");
jobject package_manager=
env->CallObjectMethod(application,getPackageManager);
(3)通过包管理器获得指定包名包
(4)通过包管理器和包名,获取含签名的包信息
jobject package_info=
env->CallObjectMethod(package_manager,getPackageInfo,package_nam e,64);
jclass package_info_clz=env->GetObjectClass(package_info);
(5)通过返回的包信息获得签名数组
(6)根据返回签名数组获取第一个的数据签名数据
jobject s ignature0=env->GetObjectArrayElement(s ignatures_array,0);
jclass s ignature_clz=
env->GetObjectClass(s ignature0);
jmethodID toCharsString=
env->GetMethodID(s ignature_clz,
"toCharsString","()Ljava/lang/String;");
jstring s ignature_str=
(jstring)(env->Cal lObjectMethod(s ignature0,toCharsString));
const char*s ign=env->GetStringUTFChars(s ignature_str,NULL);其中,s ign即为当前数字签名数据。
参见图2,是本发明实施例提供的安卓APP签名绑定方法的具体流程示意图,所述安卓APP签名绑定方法包括:
S201、通过JAVA代码获取自有正确的数字签名数据SIGN。
S202、把数字签名数据SIGN放到C语言代码中。
S203、编写C语言方法,以获取APP的数字签名数据s ing并与SIGN对比。
S204、把C语言代码打包成SO库,并编写JNI调用。
S205、在APP每次启动时,调用C语言方法,判断APK的数字签名是否一致,若是,则执行步骤S206,若否,则执行步骤S207。
S206、正常运行。
S207、结束应用。
本发明实施例在每次启动APP时,通过Java层代码调用由C语言编写的数字签名认证程序,获得当前数字签名数据,以与预先存储的数字签名信息进行对比,实现对APP签名的认证,提高签名被破解的难度,提高安全性,更好地保护APP不被非法冒充。
实施例二
本发明实施例提供了一种安卓APP签名绑定装置,能够实现上述安卓APP签名绑定方法的所有流程,参见图3,所述安卓APP签名绑定装置包括:
绑定模块1,用于将软件APP与其自有正确的数字签名信息进行绑定;
调用模块2,用于每次启动所述APP时,通过所述APP中的Java层代码调用由C语言编写的数字签名认证程序,获得当前数字签名数据;
对比模块3,用于将所述当前数字签名数据与绑定的数字签名信息进行对比;以及,
运行判断模块4,用于根据对比结果判断所述APP签名是否认证成功。
进一步地,所述运行判断模块具体包括:
继续运行单元,用于在所述当前数字签名数据与绑定的数字签名信息相一致时,判定所述APP签名认证成功,继续运行所述APP;以及,
停止运行单元,用于在所述当前数字签名数据与绑定的数字签名信息不一致时,判定所述APP签名认证失败,停止运行所述APP。
进一步地,所述绑定模块具体用于:
通过Java层代码将所述APP自有正确的数字签名数据放入C语言代码中,获得数字签名信息,以将所述APP与所述数字签名信息进行绑定。
进一步地,所述绑定模块具体包括:
包信息获取单元,用于通过包管理器获得指定包名的包信息;所述包信息包括签名;
签名数组获取单元,用于通过所述包信息获得签名数组;以及,
信息获取单元,用于获取所述签名数组的第一个数字签名数据,并将所述数字签名数据放入C语言代码中,获得所述数字签名信息。
进一步地,所述由C语言编写的数字签名认证程序的运行方法包括:
获取所述APP的包管理器;
通过所述包管理器获得指定包名的包信息;所述包信息包括签名;
通过所述包信息获得签名数组;
获取所述签名数组的第一个数字签名数据,作为当前数字签名数据。
本发明实施例在每次启动APP时,通过Java层代码调用由C语言编写的数字签名认证程序,获得当前数字签名数据,以与预先存储的数字签名信息进行对比,实现对APP签名的认证,提高签名被破解的难度,提高安全性,更好地保护APP不被非法冒充。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。