Android安全之应用签名验证

有时我们需要确保一个应用就是我们想要启动的那个应用,从而确保应用间通信的安全。这话听起来有点绕,下面以一个具体的例子来说明。

假如一家公司A做了一个支付应用PayApp,包名是”com.testa.pay”。随着这个支付应用市场越做越大,他们希望将其接口开放给其他公司,以使自己的公司获得更多的现金流。

首先,想要集成PayApp的公司B需要向公司A进行注册,注册成功后A公司分配给公司B三个东西,一个独一无二的ID,一个public key,一个private key。这三个信息都是敏感的,不能泄露给公司A和公司B之外的其他公司。

当第三方应用想要调用PayApp时,需要传入上面分配的三个参数传递给PayApp,PayApp在跟A公司的支付网关进行交互,然后将支付结果递交给调用者。

假如此时,有一个黑客开发了一个恶意应用,并且将包名取得跟PayApp一样。然后他将PayApp从手机上删除,装上自己的应用,那么当公司B的应用再次调用支付接口时,就把所有的信息传递给了黑客自己的应用!

公司A为了防止这种情况发生,专门开发了一个支付sdk,名字叫“PaySdk”,该sdk在调用PayApp前会对PayApp的签名进行校验,当校验通过时,才会将数据传递给PayApp。然后,所有想要调用PayApp接口的第三方应用,都需要继承支付sdk。这样就能防止信息被窃取。

下面详细介绍签名验证的具体过程:

首先,我们需要对android应用签名有一个基本了解:

1. 任何安装到android设备上的应用都已经被签名,即使debug状态的app也已经用debug的keystore签过名。

2. 需要发布的应用一定要用release的keystore进行签名。

3. 一个公司的release keystore只应该自己使用,不能泄露给其他人活公司。

4. 一个应用可能有多个签名。

关于如何生成keystore,并且给一个应用签名,可以查看官网教程:http://developer.android.com/intl/zh-cn/tools/publishing/app-signing.html

我们是通过对比签名的hash值来确保其完整性的,所以在此之前,我们应该获取release keystore对应的签名的hash值,这样在程序运行时才能进行比对。关于签名的hash值,我们可以通过下面的代码来获取:


PackageInfo pkgInfo;

try {

pkgInfo = mActivityContext.getPackageManager().getPackageInfo(targetPkg, PackageManager.GET_SIGNATURES);

} catch (PackageManager.NameNotFoundException e) {

Toast.makeText(mActivityContext, "The target package is not found!", Toast.LENGTH_SHORT).show();

e.printStackTrace();

return;

}

for (Signature signature : pkgInfo.signatures) {

try {

Log.i(TAG, “hash: " + Base64.encodeToString(MessageDigest.getInstance("SHA").digest(signature.toByteArray()), Base64.NO_WRAP));

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

}

上面代码中,”targetPkg”应该被替换为你想要获取的应用的包名。代码运行后,log输出如下:


04-28 13:30:34.259 1123-1123/com.zlsam.signchecher I/MainActivity: hash: 6qX30I5Kpx4agIeolKla75oO+zA=

这里我们的PaySdk需要将“hash:”后面的那个字符串记录下来,本例中是“6qX30I5Kpx4agIeolKla75oO+zA=”。一个应用可能有多个签名,因此,我们需要记录和比对所有的签名。

然后,当第三方应用通过PaySdk调用支付时,PaySdk首先通过上面代码获取应用包”com.testa.pay”的所有签名hash,然后检查这些动态获取的hash值是否都在之前记录下来的hash当中。如果是,那么验证通过,否则验证失败。

时间: 2024-10-13 15:05:06

Android安全之应用签名验证的相关文章

[转载] Android签名机制之—签名验证过程详解

本文转载自: http://www.wjdiankong.cn/android%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6%E4%B9%8B-%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/ 一.前言 今天是元旦,也是Single Dog的嚎叫之日,只能写博客来祛除寂寞了,今天我们继续来看一下Android中的签名机制的姊妹篇:Android中是如何验证一个Apk的签名.

Android签名机制之---签名验证过程具体解释

一.前言 今天是元旦,也是Single Dog的嚎叫之日,仅仅能写博客来祛除寂寞了,今天我们继续来看一下Android中的签名机制的姊妹篇:Android中是怎样验证一个Apk的签名. 在前一篇文章中我们介绍了,Android中是怎样对程序进行签名的,不了解的同学能够转战: http://blog.csdn.net/jiangwei0910410003/article/details/50402000 当然在了解我们今天说到的知识点,这篇文章也是须要了解的,不然会有些知识点有些困惑的. 二.知识

Android网络定位服务定制简述

Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状态,因此对于第三方OEM厂商经常需要与高德或百度合作,使用这两个服务提供商提供的网络位置定位服务.现将在Android平台集成第三方网络定位服务的步骤简述如下: 1.向高德或百度获取网络定位服务apk,并集成至system/app目录下,有时需要同步获取其运行时需要的库,并集成与指定目录,一般是sy

APK重新签名方法

Android使用SHA1-RSA算法进行签名.可通过eclipse插件进行,可以通过keytool和jarsigner 用命令行执行,也可以在源码下进行签名. 第一种:通过使用eclipse进行签名. 2011-5-23 22:31 上传 下载附件 (36.39 KB) 以我这个应用为例,右键项目,找到export 2011-5-23 22:31 上传 下载附件 (13.13 KB) 下一步 2011-5-23 22:31 上传 下载附件 (9.63 KB) 此处选择你要为哪个应用创建签名 继

针对移动手机漏洞与安全支付现状分析

2014年,手机支付安全的状况越加不容乐观.而Android系统漏洞却加剧了这一现状.2014年2月18日,国内漏洞报告平台乌云发布紧急预警称,淘宝和支付宝认证被爆存在安全缺陷,黑客可以简单利用该漏洞登陆他人淘宝/支付宝账号进行操作,不清楚是否影响余额宝等业务. MasterKey漏洞 2013年7月底,国家互联网应急中心发布信息,Android操作系统存在一个签名验证绕过的高危漏洞即Masterkey漏洞(Android签名漏洞). 正常情况下,每个Android应用程序都会有一个数字签名,来

最新资讯 针对移动手机漏洞与安全支付

2014年,手机支付安全的状况越加不容乐观.而Android系统漏洞却加剧了这一现状.2014年2月18日,国内漏洞报告平台乌云发布紧急预警称,淘宝和支付宝认证被爆存在安全缺陷,黑客可以简单利用该漏洞登陆他人淘宝/支付宝账号进行操作,不清楚是否影响余额宝等业务. MasterKey漏洞 2013年7月底,国家互联网应急中心发布信息,Android操作系统存在一个签名验证绕过的高危漏洞即Masterkey漏洞(Android签名漏洞). 正常情况下,每个Android应用程序都会有一个数字签名,来

Android逆向之旅---带你爆破一款应用的签名验证问题

一.前言 在之前的文章中说过Android中的安全和破解是相辅相成的,为了防止被破解,很多应用做了一些防护策略,但是防护策略也是分等级,一般简单的策略就是混淆代码和签名校验,而对于签名校验很多应用都是会做的,一般现在就两种方式: 第一种:签名校验不通过直接退出程序,也就是你会发现回编译二次打包运行失败的现象 第二种:签名校验不通过不触发程序指定逻辑,导致没有错误信息,也进不了应用的现象 关于Android中应用防护策略的文章可以看这里:Android中应用的攻防之战 今天我们就来看一下签名校验的

Android Studio NDK 入门教程(6)--JNI签名验证防止恶意调用

概述 根据前面的文章来看,JNI其实只实现了关键代码加密,如果别人拿到了你的Java Native方法定义和对应的so,即可完成对你so里方法的调.因为native 方法和类都是不能混淆的,混淆了方法的函数名就变了,调用的时候就找不到方法了,因此如果反编译APK可以非常容易拿到相关文件和代码. 显然我们需要一些手段来在JNI的验证请求接口的是不是我们的程序. 签名验证的原理 可以用如下图来表明加了验证之后调用JNI的逻辑,用一个isValid 来表明请求的应用是不是我们自己的应用.isValid

android黑科技系列——爆破一款应用的签名验证问题

一.前言 在之前的文章中说过Android中的安全和破解是相辅相成的,为了防止被破解,很多应用做了一些防护策略,但是防护策略也是分等级,一般简单的策略就是混淆代码和签名校验,而对于签名校验很多应用都是会做的,一般现在就两种方式: 第一种:签名校验不通过直接退出程序,也就是你会发现回编译二次打包运行失败的现象 第二种:签名校验不通过不触发程序指定逻辑,导致没有错误信息,也进不了应用的现象 关于Android中应用防护策略的文章可以看这里:Android中应用的攻防之战 今天我们就来看一下签名校验的