一种安卓APP签名绑定方法及装置与流程

文档序号:15020395发布日期:2018-07-25 00:34阅读:171来源:国知局

本发明涉及安全、签名认证技术领域,尤其涉及一种安卓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不被非法冒充。

以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1