Android 签名过程

前提

想要使用签名需要弄懂以下几个问题:
  • 什么是签名?
  • 签名需要什么?
  • 如何生成签名文件?
  • 如何签名?
  • 如何验证apk是否签名?
1.什么是签名

这个大家应该都熟悉,可以理解为就是给自己要发布的apk签个名,代表apk是我做的,别人不能修改或者伪造,一般指当应用需要升级时,不能随意上传一个包名一样的apk到应用市场上,想要修改应用市场apk只能拿着一样签名的apk上传,有点像信用卡签名~

2.签名需要什么

签名需要一个签名文件
遵循规则:私钥加密,公钥解密
大家知道,在与对方进行通信时,想要保证通信内容的可靠性,必须要确保两个问题:

  • 首先要确定内容的来源也就是内容发送方是真实的。
  • 其次要确定内容在发送的过程中没有被其他人拦截并进行修改。

为了确保这两个问题,就需要对发送的内容进行加密,而加密算法和密码等为了使用方便可以保存在一份文件中,这个文件就是我们说的签名文件。

使用规则:

首先内容的发送者需生成一对公钥,并且把公钥给到对方也就是内容的接收者
当发送者给接收者发送内容时,内容中除了要包含原来的实际内容,还要加上另外一段内容,这段内容是对原始内容进行提取摘要信息(对原始内容进行某一种算法比如md5 base64后得到的值)后再进行公钥加密得到的内容,也就是数字签名。

当接收者受到内容时,也包含两部分,一个是实际发送的内容,还有一个就是那段数字签名。收到后需要验证内容的真实性,同理采用和发送者一样的方式,首先采用和发送者一样的算法提取内容的摘要信息,然后使用公钥解密后得到具体值,可通过判断摘要信息和具体值是否和发送方的一致,进而验证内容是否真实。

3.如何生成签名文件

签名文件有两种:
一种是后缀名 .jks文件
一种是后缀名 .keystore文件
通过AnroidStudio使用图形化界面工具生成的为 .jks文件,使用命令行生成的为.keystore文件,其实质和使用方式是一样的。

接下来看下这两种使用过程
1.使用命令行方式生成 .keystore文件,简单快速:

keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore
#说明:
#    -genkey 产生密钥
#    -alias mykey 别名 mykey
#    -keyalg RSA 使用RSA算法对签名加密
#    -validity 40000 有效期限4000天
#    -keystore demo.keystore

例如:

gmfdeMac-mini:GMF gmf$ keytool -genkey -alias android -keyalg RSA -validity 4000 -keystore release.keystore
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  HuangChun
您的组织单位名称是什么?
  [Unknown]:  GMF
您的组织名称是什么?
  [Unknown]:  GMF
您所在的城市或区域名称是什么?
  [Unknown]:  ShenZhen
您所在的省/市/自治区名称是什么?
  [Unknown]:  ShenZhen
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=HuangChun, OU=GMF, O=GMF, L=ShenZhen, ST=ShenZhen, C=CN是否正确?
  []:  Y

输入 <android> 的密钥口令
        (如果和密钥库口令相同, 按回车):  
gmfdeMac-mini:GMF gmf$ 

查看项目目录下,就可已看到生成的release.keystore文件了。

2.使用AndroidStuido图形化界面工具生成 .jsk签名文件:
选择菜单栏 Buid -> Generate Signed Apk… -> Next -> Next -> CreateNew(选择签名文件存放路径,设置文件密码,别名,签名密码,及相关信息等)-> Next -> reset master password(忘记了重置一个常用密码即可)-> 显示Reveal in Finder窗口 (打开后显示的是已签名的apk文件目录)-> 然后在目录下就有一个 .kjs文件,这就是我们的签名文件

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

4.如何签名

1.使用命令行签名
使用产生的keystore对apk签名,使用到的是jarsigner.exe (windows),Mac类似,命令如下

jarsigner -verbose -keystore demo.keystore -signedjar test_signed.apk test.apk mykey
#    test_signed.apk是签名之后的文件
#    test.apk是需要签名的文件

另外需要注意的是,如果你的jdk版本在1.7以上,你在对apk签名时,需要加上这个参数,否则会出现:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]的错误。:

-digestalg SHA1 -sigalg MD5withRSA

2.使用AndroidStudio配置签名文件签名,首先要修改gradle中的签名配置,在android节点下面添加一下内容,然后打包即可获得签名的正式包:

    signingConfigs {
        debug {
            // 配置debug版本的数字签名证书
            storeFile file("/Users/gmf/Desktop/Coding/GMF/GMF/release.keystore")
            storePassword "123456"
            keyAlias "android"
            keyPassword "123456"
        }
        release {
            // 配置release版本的数字签名证书(为了方便,这里的release版本和debug版本共用一个数字签名证书)
            storeFile file("/Users/gmf/Desktop/Coding/GMF/GMF/release.jks")
            storePassword "123456"
            keyAlias "android"
            keyPassword "123456"
        }
    }

buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

这里只是展示了两种签名文件,debug模式不需要签名可不配置。

5.如何查看签名信息

1、查看keystore的信息

keytool -v -list -keystore  my-release-key.keystore

-list:列出密钥库中的条目。
-keystore:数字证书位置。
输入命令后,是需要输入签名密码的。

例如:

gmfdeMac-mini:GMF gmf$ keytool -list -keystore release.keystore -alias android -v
输入密钥库口令:  
别名: android
创建日期: 2017-10-25
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=HuangChun, OU=GMF, O=GMF, L=ShenZhen, ST=ShenZhen, C=CN
发布者: CN=HuangChun, OU=GMF, O=GMF, L=ShenZhen, ST=ShenZhen, C=CN
序列号: 5a6c1f9b
有效期开始日期: Wed Oct 25 16:07:23 CST 2017, 截止日期: Sat Oct 07 16:07:23 CST 2028
证书指纹:
         MD5: 0A:65:51:8D:A7:6C:7C:E3:A8:52:38:0A:2D:83:6F:23
         SHA1: C8:B7:E7:2E:58:21:E2:68:61:F1:CB:B6:A2:92:43:1B:52:F1:1D:65
         SHA256: 64:DE:2F:AA:99:1D:80:0C:DC:EB:B2:65:5D:4D:EF:7B:C7:9C:DD:82:3F:3B:C9:B3:28:F7:2A:67:4D:BE:72:2D
         签名算法名称: SHA256withRSA
         版本: 3

扩展: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: A1 39 7F 79 85 F3 92 D5   B0 36 FF 99 EF 70 8A 36  .9.y.....6...p.6
0010: 0A 11 BA E7                                        ....
]
]
gmfdeMac-mini:GMF gmf$ 

2、查看keystore的公钥证书信息

keytool -list -keystore demo.keystore -alias mykey -rfc
注:获取Base64格式的公钥证书,RFC 1421

例如:

gmfdeMac-mini:GMF gmf$ keytool -list -keystore release.keystore -alias android -rfc
输入密钥库口令:  
别名: android
创建日期: 2017-10-25
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
-----BEGIN CERTIFICATE-----
MIIDZTCCAk2gAwIBAgIEWmwfmzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJDTjERMA8GA1UE
CBMIU2hlblpoZW4xETAPBgNVBAcTCFNoZW5aaGVuMQwwCgYDVQQKEwNHTUYxDDAKBgNVBAsTA0dN
RjESMBAGA1UEAxMJSHVhbmdDaHVuMB4XDTE3MTAyNTA4MDcyM1oXDTI4MTAwNzA4MDcyM1owYzEL
MAkGA1UEBhMCQ04xETAPBgNVBAgTCFNoZW5aaGVuMREwDwYDVQQHEwhTaGVuWmhlbjEMMAoGA1UE
ChMDR01GMQwwCgYDVQQLEwNHTUYxEjAQBgNVBAMTCUh1YW5nQ2h1bjCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAJw1ARCyNlZhTdYBHZNVBTqMBLYwqUwC4KgA2T4AuXR/rX0/gnKvASil
CsU5eRvpMreSYNKwulqaPBJ614W3AzZ4wmV63CU6KSiJ/ipYweqksGEM1xUGzq+deoB31fn4Skw1
+7FrRZpUzlgc+ut5xc8xHXUqUiiRZwuONul2i5cK+epePF8ldPb+rASSc5e0TzhAOPyogwhTGiDT
u2tbjArccIAnyfTi38YigoGQJ4rHlADE79cCqAwV0hJZkFI1PP6qDdSEYe9DcgUWzbHslTqUhViz
HsZDvAlD0qriD9qw7QJNZjuWnqROc1lA+V1mug74/3/RpLUGV1bcp8mFr10CAwEAAaMhMB8wHQYD
VR0OBBYEFKE5f3mF85LVsDb/me9wijYKEbrnMA0GCSqGSIb3DQEBCwUAA4IBAQBRDkoxgcrVIsX2
xD2ePHiIUVu/jKaC7aeRokWFRpcmS2UUqTShNvs206HiKV4RYG7VkOY/hL69ZJdY96wlxTU4q/Z3
5J0uImIzzK49ZY++oa9Hh6glA0EOzm9ehSBl4ocTXVgfysAmELTSTexm5zs+AlA/2PZ/xiCvMdnT
oRAvmHvwcx7a/v9ZUShbnkFYAf36jYmaaGKLog8NFDJETpDVS5ml8S80jFvwxAOyc/fQFFejbCXc
ShMj6cA7Zzk28dPyscKMrkG7m2a17BC7pA8VdJFcW144nsq8RXhGFVP2kJYY5wB2e1wfN1x6rUB9
1prUdJ9gA/RrKSlJcIOhCLSm
-----END CERTIFICATE-----
gmfdeMac-mini:GMF gmf$ 

3、查看apk的签名信息

jarsigner -verify -verbose -certs <your_apk_path.apk>

参考内容
Android应用数字签名详解
Android签名机制之—签名过程详解
Android Studio 权威教程 打包、生成jks密钥、签名Apk、多渠道打包
Android签名机制介绍:生成keystore、签名、查看签名信息等方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值