android 签名浅述

来源:互联网 发布:网络攻防 编辑:程序博客网 时间:2024/06/04 19:35

1、签名简介

1.1、签名的作用

1)系统签名
我们都知道编译eng版本的时候,用的是testkey,这种key只是研发阶段,而且这种密钥谁都可以使用。当发布release版本的时候,就需要release key ,防止别人盗用。
2)apk 签名
(1) 开发者的身份验证,由于开发商可能使用的package name 相同来混淆已经安装的程序,以此保证签名的不同,来保证apk 不会被替换。
(2)保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中每个内容不被替换。
3)recovery 签名的作用
recovery 签名主要是验证数据的完整性

1.2、签名简介

要对Android系统进行签名,需要生成四种类型的key文件
1)releasekey(testkey)
2)media
3)shared
4)platform

以上四种,可以在代码/build/target/product/security/里看到对应的密钥。
其中shared.pk8代表私钥
shared.x509.pem代表公钥 (一定成对出现)
其中testkey是android编译的时候默认的签名key,

2、生成key的步骤

2.1、生成key用到的工具

我们以releasekey为例,Android使用SHA1-RSA算法进行签名。我么可以在源码下/development/tools/make_key 来实现。

2.2、制作方法

例如:./make_key releasekey ‘/C=CN/ST=ShangHai/L=XuHui View/O=ThunderSoft/OU=MetorCar/CN=lumeng/emailAddress=lumeng0714@ThunderSoft@.com’

其实这是有两个参数:
1)releasekey 就是你要制作的上述四种Key的名字
1)releasekey(testkey)
2)media
3)shared
4)platform

2)下面一个是地址,公司,厂家,制作者的信息等
‘/C=CN/ST=JiangSu/L=ShangHai View/O=ThunderSoft/OU=MetorCar/CN=lumeng/emailAddress=lumeng0714@ThunderSoft@.com’
C=CN–>国家名字
ST=JiangSu–>省城市名字
L=ShangHai–>城市名字
View/O=ThunderSoft 公司名称
OU=MetorCar–> 部门名称或项目名称
CN=lumeng–>制作者名称
emailAddress=lumeng0714@ThunderSoft@.com–>制作者邮箱地址

3)制作的过程当中会让输入密码,此步直接enter跳过,要不然每次签名apk,还需要手动输入签名密码。

另外四种也同样方法生成,此时会生成如下八个文件:
这里写图片描述

其中.pk8是密钥,.x590.pem是公钥。
如果制作过程中出现错误,检查格式,使用sudo 权限。

3、如何签名

3.1、对apk进行签名

执行:
java -jar signapk.jar releasekey.x509.pem releasekey.pk8 input.apk output.apk
(signapk.jar:由/platform/build/tools/signapk/编译产出,可以在/out/host/linux-x86/framework/中找到。)

如果apk的android.mk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。如果设置:LOCAL_CERTIFICATE=platform就代表使用platform来签名,这样的话apk就有了和system相同的签名,因为系统级别的签名也是使用platform来签名,此时需要添加代码:
android:sharedUserld=”android.uid.system”才有用。

签名后,输出文件的meta_inf目录下生长出如下文件
MANIFEST.MF:对分文件夹非签名文件的文件,逐个生成SHA1的数字签名信息
CERT.SF:对Manifest文件,使用SHA1-RSA算法,用私钥进行签名。
CERT.RSA:CERT.RST文件中保存了公钥、所采用的加密算法等信息。

3.2、对OTA升级release key的替换

1)首先在build/core/ 里面搜索testkey,查看testkey怎么用到的编译系统,
grep -nir “testkey”

我们可以看到 在Makefile 文件,以及config.mk 文件里面都会含有搜索字段
在/build/core/Makefile里面

ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey)BUILD_KEYS := test-keyselseBUILD_KEYS := dev-keys

我们追踪DEFAULT_SYSTEM_DEV_CERTIFICATE
/build/core/config.mk

ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)else  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkeyendif

我们在追踪PRODUCT_DEFAULT_DEV_CERTIFICATE

要使用releasekey我们只需要修改
/device/平台名/项目名$项目名.mk
中添加或指定
PRODUCT_DEFAULT_DEV_CERTIFICATE的值:
DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey (release的路径)

同时修改,build/core/Makefile内容:

ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)BUILD_KEYS := release-keysendif

4、如何验证签名

倘若签名不同,会安装不了apk 和完成升级。

对与公钥和密钥的差别大家可以看这个博客:
http://blog.csdn.net/u014756827/article/details/52279146

文献参考:
1、Android OTA releasekey 替换
http://blog.csdn.net/qq_34052921/article/details/77877236

2、android系统release签名
http://blog.csdn.net/yangkai6121/article/details/38682321

3、生成release版本的Android系统 –签名
http://blog.163.com/yi_yixinyiyi/blog/static/136286889201132533759563/

4、Android——编译release版签名系统
http://www.cnblogs.com/leaven/p/3860583.html

原创粉丝点击