Android签名机制用法详解

Android独有的安全机制有:权限机制,签名机制,混淆机制等,这里我们来了解签名机制的使用方法
签名机制主要作用:升级App,检查权限

升级App

用户在升级一款已经安装过的App时,如果程序的修改来自于同一来源,则允许升级安装,否则会提示签名不一致无法安装的提示。

权限检查

对于申请权限的 protection level 为 signature 或者 signatureOrSystem 的,会检查权限申请者和权限声明者的证书是否是一致的。

生成keystore

1
keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore

命令说明:

1
2
3
4
5
-genkey 产生密钥  
-alias mykey 别名 mykey
-keyalg RSA 使用RSA算法对签名加密
-validity 40000 有效期限4000天
-keystore demo.keystore

密钥和证书管理工具命令解释如下(keytool)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-certreq            生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令

对apk进行签名

1
2
[plain] view plain copy
jarsigner -verbose -keystore demo.keystore -signedjar test_signed.apk test.apk mykey

test_signed.apk是签名之后的文件
test.apk是需要签名的文件
另外需要注意的是,如果你的jdk版本在1.7以上,你在对apk签名时,需要加上这个参数:

1
2
[plain] view plain copy
-digestalg SHA1 -sigalg MD5withRSA

否则会出现:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]的错误。

签名工具用法:(jarsigner)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
jarsigner [选项] jar-file 别名
jarsigner -verify [选项] jar-file [别名...]
[-keystore <url>] 密钥库位置
[-storepass <口令>] 用于密钥库完整性的口令
[-storetype <类型>] 密钥库类型
[-keypass <口令>] 私有密钥的口令 (如果不同)
[-certchain <文件>] 替代证书链文件的名称
[-sigfile <文件>] .SF/.DSA 文件的名称
[-signedjar <文件>] 已签名的 JAR 文件的名称
[-digestalg <算法>] 摘要算法的名称
[-sigalg <算法>] 签名算法的名称
[-verify] 验证已签名的 JAR 文件
[-verbose[:suboptions]] 签名/验证时输出详细信息。子选项可以是 all, grouped 或 summary
[-certs] 输出详细信息和验证时显示证书
[-tsa <url>] 时间戳颁发机构的位置
[-tsacert <别名>] 时间戳颁发机构的公共密钥证书
[-tsapolicyid <oid>] 时间戳颁发机构的 TSAPolicyID
[-altsigner <类>] 替代的签名机制的类名
[-altsignerpath <路径列表>] 替代的签名机制的位置
[-internalsf] 在签名块内包含 .SF 文件
[-sectionsonly] 不计算整个清单的散列
[-protected] 密钥库具有受保护验证路径
[-providerName <名称>] 提供方名称
[-providerClass <类> 加密服务提供方的名称
[-providerArg <参数>]]... 主类文件和构造器参数
[-strict] 将警告视为错误

查看签名信息

1、查看keystore的信息

1
2
[plain] view plain copy
keytool -list -keystore demo.keystore -alias mykey -v

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

1
2
[plain] view plain copy
keytool -list -keystore demo.keystore -alias mykey -rfc

(注:获取Base64格式的公钥证书,RFC 1421)

3、查看apk的签名信息

1
2
[plain] view plain copy
jarsigner -verify -verbose -certs <your_apk_path.apk>