android数字签名积机制,android签名机制(1)——了解签名

android中所有运行在设备上的应用都必须要签名,这是系统提供的一种安全认证机制。下面以问答形式来自我认识下,后面在根据部分内容来进一步研究:

1.为什么用签名机制?如果不签名呢?

为了防止app被反编译替换原有的程序,如果有相同包名的应用存在,新的apk则不能安装在设备上。

就算被反编译,在没有原有私钥的情况,重新签名生成的apk和原来的apk的标志是不同的。如此,被修改的apk如果安装在原来的设备上,则会提示:

Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

如果不签名呢?直接安装到设备上,则也提示:

56e79dde088cb170d66265220a2c3751.png

从上面可以有个很简易的认知,如果不签名或者签名不对,则不能安装在设备上。

如果应用androidmenifast.xml中加了android:sharedUserId="android.uid.system"时,要用平台签名,否则提示:

59696cccb805f43cdd7b8560dc425529.png更多安装异常可以查找相关信息。

2.平台签名?签名有很多种么?

有很多种。在android源码目录build\target\product\security,有如下几种签名密钥。

081c69fda6f215a12855de9d946b4190.png

*.pk8表示的是private key---私钥

*.x509.pem理解为公钥

这里的platform.*即为平台签名的私钥和公钥,加密方式是非对称加密。从上图可以看出有好几种的签名,4种具体表示可参考当前目录下的README.

The following commands were used to generate the test key pairs:

//制作key的脚本和相关信息

development/tools/make_key testkey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

development/tools/make_key shared '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

development/tools/make_key media '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

The following standard test keys are currently included:

//testkey--当应用没有指定其他key时,源码默认以此key签名

testkey -- a generic key for packages that do not otherwise specify a key.

//平台签名,系统级应用用此签名

platform -- a test key for packages that are part of the core platform.

//当需要用到联系人的共享数据时,需要此签名

shared -- a test key for things that are shared in the home/contacts process.

//对系统的media/download相关的应用,用此签名

media -- a test key for packages that are part of the media/download system.

These test keys are used strictly in development, and should never be assumed

to convey any sort of validity. When $BUILD_SECURE=true, the code should not

honor these keys in any context.

signing using the openssl commandline (for boot/system images)

--------------------------------------------------------------

1. convert pk8 format key to pem format

% openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem

2. create a signature using the pem format key

% openssl dgst -binary -sha1 -sign testkey.pem FILE > FILE.sig

extracting public keys for embedding

------------------------------------

it's a Java tool

but it generates C code

take a look at commands/recovery/Android.mk

you'll see it running $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar

从shareed签名,可以联想到:

当A应用需要用到B应用的共享数据时,他们的android:sharedUserId="xxx"需要一致,签名也需要一致

注:当应用工程的Android.mk中未指定LOCAL_CERTIFICATE时,源码编译则使用默认testkey

3.如何区别签名过和没签名的apk?

注:apk支持多次签名,以最后一次为准

apk是个zip包格式,这里就有个很简单直观的方式---用压缩程序方式打开apk,看下图:

602f6995fb1491f7be7225975acc9469.png

签名过的apk包里有个META-INF文件夹,里面就是对各个资源文件用SHA1加密后的值。

4.如何签名?

5.了解加密、数字摘要、数字签名和数字证书

f1d36a8066ce8625aa9b54443e702254.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值