Android 签名机制

1、如何对APK签名

(1)、创建数字证书,android123.keystore

keytool -genkey -alias android123.keystore -keyalg RSA -validity 20000 -keystore android123.keystore

keytool工具是Java JDK自带的证书工具

-genkey参数表示:要生成一个证书(版权、身份识别的安全证书)

-alias参数表示:证书有别名,-alias android123.keystore表示证书别名为android123.keystore

-keyalg RSA表示加密类型,RSA表示需要加密,以防止别人盗取

-validity 20000表示有效时间20000天

-keystore android123.keystore表示要生成的证书名称为android123.keystore

Enter key password for <android123.keystore>

(RETURN if same as keystore password):此时按回车

生成的数字证书android123.keystore里面包换了非对称加密的私钥、公钥和证书。

(2)、使用数字证书进行签名

jarsigner -verbose -keystore android123.keystore -signedjar test_signed.apk test.apk android123.keystore
    jarsigner是Java的签名工具
    -verbose参数表示:显示出签名详细信息
    -keystore表示使用当前目录中的android123.keystore签名证书文件。
    -signedjar test_signed.apk表示签名后生成的APK名称,test.apk表示未签名的APK Android软件, android.keystore表示别名

(3)、签名后生成了META-INT文件夹,里面包含的文件如下:

通过这三个文件,我们了解下第二步中jarsigner都做了什么事情,我们先看MANIFEST.MF,如下:

Manifest-Version: 1.0
Created-By: 1.0 (Android)

Name: res/raw/aes.lua
SHA1-Digest: M2O7Kjh31bRSTSaX9Kxeg9+r8t0=

Name: AndroidManifest.xml
SHA1-Digest: gJSLROnRQjVNfuSf9ZLQ/jcfjCQ=

Name: lib/armeabi-v7a/libuencrypt.so
SHA1-Digest: 60nq3GlIOFjA2qQwpD0GHF0B+fs=

Name: assets/aes.lua
SHA1-Digest: M2O7Kjh31bRSTSaX9Kxeg9+r8t0=

Name: res/drawable-hdpi-v4/ic_launcher.png
SHA1-Digest: Nq8q3HeTluE5JNCBpVvNy3BXtJI=

Name: res/layout/activity_main.xml
SHA1-Digest: 29xFOv25tmFws/fZywW1pnKb0/0=

Name: res/layout/lv_item.xml
SHA1-Digest: n+ABu8eXc8sgsr/koDg/u1UIHsk=

Name: res/drawable-mdpi-v4/ic_launcher.png
SHA1-Digest: RRxOSvpmhVfCwiprVV/wZlaqQpw=

Name: res/menu/main.xml
SHA1-Digest: FwPQ14VCI33UrtPR12pUamCNBtI=

Name: lib/armeabi-v7a/libalgms.so
SHA1-Digest: l6EtvZsMbYZLCRF/ym+gDCbb66A=

Name: res/layout/gv_item.xml
SHA1-Digest: zJG1Od3RKnHgvtNspfJoL3Gjl9c=

Name: res/drawable-xhdpi-v4/ic_launcher.png
SHA1-Digest: AfPh3OJoypH966MludSW6f1RHg4=

Name: lib/armeabi/libluajava.so
SHA1-Digest: hEXHJ2RO/N4HG7HpkvNLpwkezx8=

Name: resources.arsc
SHA1-Digest: xvke7fWkq3vTndO6GxJygC191Io=

Name: lib/armeabi-v7a/libluajava.so
SHA1-Digest: G1oHj8pHfhE6cTmiIIyLf7q3g5I=

Name: res/layout/notify.xml
SHA1-Digest: cwi7OQR/TBBCikvfrG1mWb/7aQ8=

Name: classes.dex
SHA1-Digest: ZFp/aGRiQlOrGaeCybupky6xL9w=

Name: res/drawable-xxhdpi-v4/ic_launcher.png
SHA1-Digest: GVIfdEOBv4gEny2T1jDhGGsZOBo=

Name: lib/armeabi/libalgms.so
SHA1-Digest: sThUrFV9sUiv9GDot0L92RkYBPs=

Name: lib/armeabi/libuencrypt.so
SHA1-Digest: 60nq3GlIOFjA2qQwpD0GHF0B+fs=

里面包含了所有apk中资源分别求Hash值。

我们再看CERT.SF,如下:

Signature-Version: 1.0
SHA1-Digest-Manifest: rpk81cwms7B69LRe8+DWDOXsXh4=
Created-By: 1.0 (Android)

Name: res/raw/aes.lua
SHA1-Digest: 328J86FdzrMHCGbJ9zgSIL66Vhg=

Name: AndroidManifest.xml
SHA1-Digest: 5FgYlUZJI5rg9CliE7aY0lJvQeA=

Name: lib/armeabi-v7a/libuencrypt.so
SHA1-Digest: c4LKMukodajHJes+c40iIKVR5Mc=

Name: assets/aes.lua
SHA1-Digest: bxsaWYSVcIxoulpdWPfY0BV2PiQ=

Name: res/drawable-hdpi-v4/ic_launcher.png
SHA1-Digest: nVLQ/wUjf9D4KSB2I7WqoHR14JY=

Name: res/layout/activity_main.xml
SHA1-Digest: JW6OyAas5Wk9A3gkVFXQfnW5/xM=

Name: res/layout/lv_item.xml
SHA1-Digest: dNWFJFprP0T6rcGEzItXC7wCYkM=

Name: res/drawable-mdpi-v4/ic_launcher.png
SHA1-Digest: NBFXy1maYHW4TAiVCw6R9+EBNqI=

Name: res/menu/main.xml
SHA1-Digest: OKnRLZ88PSIyuOBi7mLTP2st5qo=

Name: lib/armeabi-v7a/libalgms.so
SHA1-Digest: FtY/V2plAUjgAuML1e13WkbAlv4=

Name: res/layout/gv_item.xml
SHA1-Digest: dkF+JesLgH0dGCDQ3n8xB5x27/c=

Name: res/drawable-xhdpi-v4/ic_launcher.png
SHA1-Digest: qLB+xSuTsdod1eS2aPJel/A5PvE=

Name: lib/armeabi/libluajava.so
SHA1-Digest: s4qgp8flPTMEZkF8z5QutBgFxrM=

Name: resources.arsc
SHA1-Digest: 541ycGJWJPTgwVyrgsxvB8pjjCM=

Name: lib/armeabi-v7a/libluajava.so
SHA1-Digest: Ef0wS9E2VVNlCobz+Rfus6H98sQ=

Name: res/layout/notify.xml
SHA1-Digest: ioOWjUP2Gg9EEwhuElzwisdCR6I=

Name: classes.dex
SHA1-Digest: K7z+duqJFBCe/hMgJWJQrzmLwxE=

Name: res/drawable-xxhdpi-v4/ic_launcher.png
SHA1-Digest: W7nSszMeL1x0eIt3K2CoCIHU6Qg=

Name: lib/armeabi/libalgms.so
SHA1-Digest: +F1sBBeuDvU3e9uqpFyvdOSdQAE=

Name: lib/armeabi/libuencrypt.so
SHA1-Digest: JToW2wKlog94dVZeNv3cGOC3CwA=

首先对MANIFEST.MF整个文件求Hash值存放在SHA1-Digest-Manifest中,然后再对MANIFEST.MF里面的Hash值再求Hash值。

最后我们再来看,CERT.RSA,它是个二进制文件。只能通过特定的工具读出来其中的内容。可参考从CERT.RSA中提取证书一文。

读出来的内容如下,参考Android签名与认证详细分析之二(CERT.RSA剖析),如下图:

我们先看最后一步的已加密的Hash值,这是对CERT.SF文件求Hash值然后使用私钥加密后的结果。

再往上看密钥,这里的密钥指的是非对称加密的公钥。这个文件中不保存对称加密的私钥。

CERT.RSA还保存了发行者名称和主体名称,生效日期和终止日期等待。

了解了这个三个文件的内容,我们也就知道了jarsigner都做了什么事情。

2、签名的作用

(1)保证内容的完整性

在安装APK时,计算APK中每个资源的Hash值与MANIFEST.MF里面的Hash值做对比;如果成功,再计算MANIFEST.MF文件的Hash值与CERT.SF的Hash值做对比;如果成功,使用公钥解密CERT.RSA已加密的Hash值,然后与对CERT.SF文件求出的Hash值做对比;如果成功,表示验证通过。

如果恶意修改代码,再恶意修改MANIFEST.MF对应的Hash值,再恶意修改CERT.SF的Hash值,但是最后无法修改CERT.RSA里面的Hash值,因为没有私钥。

1)如果当前的APK被篡改,直接放入手机中运行,第一步在计算APK中每个资源的Hash值与MANIFEST.MF里面的Hash值做对比,这一步就Failed了。

2)如果当前的APK被篡改后重新签名,由于系统中原有同样包名的apk,发现与原有签名的公钥不一致,直接被reject。除非把原应用删除,再安装新的应用。

(2)shareUid

如果两个应用shareUid,说明两个应用可以对对方的私有目录进行访问,这就造成了安全隐患。如果360和QQ,sharedUid,那么360就可以访问QQ目录下(/data/data/com.tencent/...)的私有数据。所以我们规定shardUid的两个应用必须使用同样的私钥进行签名,在CERT.RSA体现在公钥一致。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 21:56:10

Android 签名机制的相关文章

Android签名机制:生成keystore、签名、查看签名信息

Android独有的安全机制,除了权限机制外,另外一个就是签名机制了.签名机制主要用在以下两个主要场合起到其作用:升级App和权限检查. 升级App 用户在升级一款已经安装过的App时,如果程序的修改来自于同一来源,则允许升级安装,否则会提示签名不一致无法安装的提示. 权限检查 我曾在Android Permission权限机制的具体使用一文中提过,对于申请权限的  protection level 为 signature 或者 signatureOrSystem 的,会检查权限申请者和权限声明

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

一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.由于前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉的,就是为了安全,不让别人改动你的apk,可是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制. 在说道Android签名之前,我们须要了解的几个知识点 1.数据摘要(数据指纹).签名文件,证书文件 2.jarsign工具签名和signapk工具签名 3

[转载] 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%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3/ 一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉

Android签名机制之---签名过程详解

一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了..我说Android中的签名大家都会熟悉的,就是为了安全,不让别人修改你的apk,但是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制. 在说道Android签名之前,我们需要了解的几个知识点 1.数据摘要(数据指纹).签名文件,证书文件 2.jarsign工具签名和signapk工具签名 3

[转载] 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签名机制

http://blog.csdn.net/feiyangxiaomi/article/details/40298155 1.android为什么要签名 所有的Android应用程序都要求开发人员用一个证书进行数字签名,anroid系统不会安装没有进行签名的由于程序.平时我们的程序可以在模拟器上安装并运行,是因为在应用程序开发期间,由于是以Debug面试进行编译的,因此ADT根据会自动用默认的密钥和证书来进行签名,而在以发布模式编译时,apk文件就不会得到自动签名,这样就需要进行手工签名.   给

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

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

Android 安全机制(1)uid 、 gid 与 pid

1.概述 Android 安全机制来源于Linux,并且以Linux权限管理为基础,要了解Android的安全机制,需要从linux中的安全机制了解开始,而用户的权限管理又是linux安全机制的最基本的一个组成 2.linux中的用户(UID).组(GID).进程(PID) 在 Linux 中,一个用户 UID 标示一个给定用户.Linux系统中的用户(UID)分为3类,即普通用户.根用户.系统用户. 普通用户是指所有使用Linux系统的真实用户,这类用户可以使用用户名及密码登录系统.Linux

Android安全机制(2) Android Permission权限控制机制

1.概述 Android 是一个权限分离的系统 . 这是利用 Linux 已有的权限管理机制,通过为每一个 Application 分配不同的 uid 和 gid , 从而使得不同的 Application 之间的私有数据和访问( native 以及 java 层通过这种 sandbox 机制,都可以)达到隔离的目的 . 与此 同时, Android 还 在此基础上进行扩展,提供了 permission 机制,它主要是用来对 Application 可以执行的某些具体操作进行权限细分和访问控制,