Android 签名初认识

针对 Android 中签名的相关问题,做一些记录整理。

以前,遇到许多关于签名的问题

  1. APK 安装时的校验
  2. 成为 Android 系统级应用
  3. 查看应用的MD5或者是SHA1信息
  4. v2签名
  5. ….

这些问题都将在后面得到答案。

什么是签名

首先,什么是签名?为什么需要签名?

在生活中,一般我们对某个文件进行签名,代表签名者对此文件的认可,防止签名者抵赖,同时防止文件被他人篡改。在计算机中也一样,签名就是对某个文件的一种认证过程,而签名校验就可以有效防止文件被恶意篡改,证明此文件是签名者的原始文件。

签名的流程如下:

利用一个单向哈希函数对原始文件进行运算,生成数字摘要,然后用私钥加密这个数字摘要,这个加密后的数字摘要就是数字签名,最后将数字签名和原始文件一起打包成一个新的文件,如此,这个原始文件就被签名了。

校验签名的流程如下:
拿到被签名后的文件之后,首先提取出原始文件与签名,然后使用相同的单向哈希函数对原始文件运算,生成数字摘要,然后用公钥解密数字签名,然后对比两个数字摘要,如果相同就表示校验成功。

数字签名是非对称加密与数字摘要的组合应用,它有两种功效:

  1. 确定文件(消息)确实是由签名者签名并发出来的,因为别人假冒不了签名者的签名。
  2. 数字签名能确定消息的完整性。

当然,数字签名一般不单独使用,基本都是用在数字证书里面。

Android 签名

Android 要求所有已安装的应用程序都使用数字证书做数字签名,数字证书的私钥由开发者持有。

Android 使用数字证书作为标识应用程序开发者的一种方式,并在应用程序之间建立信任的关系,证书并不用来控制用户能否安装那个应用程序。

Android 的数字证书与普通数字证书最大的区别是,Android 数字证书并不需要权威的数字证书签名机构(CA)认证,它只是用来让应用程序包自我认证的,完全可以使用自签名证书(seft-signed certificates)。

没有正确签名的应用,Android系统不会安装或运行,此规则适用于任何地方运行的Android系统,不管是在模拟器还是在真实设备上。即使是开发人员调试时的应用程序,也是使用了默认的签名文件 (目录:用户名/.android/debug.keystore,密码:android)进行签名的。

只有签名文件相同且包名相同的 apk 才可以覆盖安装并保留用户信息,这样做是为了防止已安装的应用被恶意的第三方覆盖或替换。

此外,数字证书都是有有效期的,Android 只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

Android 签名的作用

Android 签名的主要作用是为了

  • 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
  • 应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
  • 代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。

所以一旦给Apk签名并上线后,签名文件和密码别名等一定要记住不能丢失,否则会损失用户且带来灾难性的后果.

签名文件格式

签名文件格式有很多种,这里主要是介绍 Android 相关的,比如最早的 keystore、jks、pem/pk8等。

  • KeyStore: KeyStore 是 Eclipse 开发 Android 的时候最早的签名文件了。
  • JKS (Java key store): jks 是目前 Android Studio 中创建签名文件的格式 (Build -> Generate Signed APK) 即可创建和使用签名文件为对应apk进行签名
  • pem/pk8 :这个是系统的签名文件,Android系统在编译的时候也是需要签名,所以这个是系统的签名文件,如果想使自己的应用变成系统应用,则必须使用系统的签名文件进行签名。

Signature Versions V1、V2

在新的 Android studio 版本中,出现了 v2 签名,先看看官方解释:

Signature Versions V1、V2

V1:通过ZIP条目进行验证,这样APK 签署后可进行许多修改,可以移动甚至重新压缩文件。
V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证)。

只勾选v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式 。
只勾选V2签名7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证
同时勾选V1和V2则所有机型都没问题

或者在app的build.gradle的android标签下加入如下
signingConfigs {
debug {
v1SigningEnabled true
v2SigningEnabled true
}
release {
v1SigningEnabled true
v2SigningEnabled true
}
}

建议把V1和V2两个选项全部勾选,如果全部勾选出现了问题,那么可以忽略这种新的签名机制,只勾选第一个选项(V1),依旧使用我们之前老的签名机制。

生成数字证书

生成数字证书有两种方式,包括带图形界面的 AS,以及命令行的keytool。

Android Studio

在 Android studio 中生成签名文件非常简单,build -> Generate Signed APK -> Create new…

生成 keystore

填写完信息之后就生成了数字证书,之后下一步就给 apk 签名上了。

AS 签名带界面的,自然方便,但有时候需要使用命令行工具。

签名相关的两个工具都在 JDK 中

  • keytool 是个密钥和证书管理工具,可以用来生成证书。
  • jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名

Keytool 生成

使用keytool生成证书:
keytool -genkey -keystore test.keystore -alias test -keyalg RSA -validity 10000

参数解释:

  1. -genkey 产生证书文件
  2. -keystore 指定密钥库的.keystore文件中
  3. -alias 指定别名
  4. -keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
  5. -validity 为证书有效天数

jarsigner 签名

数字证书生成后,需要使用 jarsigner 来签名
jarsigner -verbose -keystore test.keystore -signedjar -signed.apk unsigned.apk 'test'

参数说明:

  1. -verbose:指定生成详细输出
  2. -keystore:指定数字证书存储路径
  3. -signedjar:该选项的三个参数为 -签名后的apk包,-未签名的apk包,-数字证书别名(注意顺序)

查看签名文件

在使用一些第三方库时(如分享、百度地图),有时会被要求提供 MD5 或者 SHA1值。

查看签名文件信息需要用到 keytool 工具,keytool 是 JDK 自带的工具,需要配置环境变量,输入以下命令:
keytool -list -v -keystore <keystore文件名>

例如,查看位于 .android 目录下默认的签名文件 debug.keystore 的信息:

查看签名文件

此命令需要提供 签名文件的密码, debug.keystore 文件的别名是 androiddebugkey ,密码是 android ,之后输出了签名文件的 MD5、SHA1、SHA256的值。

系统签名

普通应用程序的权限受限制,需要系统应用权限才行,因此在定制化系统中,需要将应用程序升级为系统应用程序,这时候就需要系统签名。

这里有两种方案。

使用Android签名工具重新签名

  1. 提供对应平台签名文件「platform.pk8」和「platform.x509.pem」,如果是定制系统,为了省事儿,直接找编译系统的兄弟讨要,如果是google 原生系统,则可以到源码处下载,8.0.0_r4 的两个文件地址在此 ,其他平台版本的位置类似。

  2. 提供签名工具「signapk.jar」,8.0.0_r4的签名工具地址在此,其他平台版本的位置类似。

  3. 将签名证书「platform.pk8」、「platform.x509.pem 」,签名工具「signapk.jar 」放置在同一个文件夹,执行命令
    java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk signedDemo.apk

生成系统debug.keystore文件

这种方式的好处就是不用每次都手动打包,可以直接配置在 AS 中,同样需要前面的平台签名文件「platform.pk8」和「platform.x509.pem」。

  1. 把pkcs8 格式的私钥转化成 pkcs12 格式:

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt

  1. 把 x509.pem 公钥转换成 pkcs12 格式

openssl pkcs12 -export -in platform.x509.pem -inkey shared.priv.pem -out shared.pk12 -name androiddebugkey

密码都是:android
  1. 生成debug.keystore

keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey

原文地址:https://www.deemons.cn/2018/05/10/Android-%E7%AD%BE%E5%90%8D%E9%82%A3%E7%82%B9%E4%BA%8B%E5%84%BF/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342