首页
社区
课程
招聘
[原创]android签名证书文件的解析和签名校验的加强
发表于: 2016-2-21 13:54 11764

[原创]android签名证书文件的解析和签名校验的加强

2016-2-21 13:54
11764

这篇文章介绍了apk中META-INF目录下CERT.RSA文件的解析,以及签名校验加强的一些方法。并用C++实现了解析代码。

附件有文章。
代码 https://github.com/W-WTerDan/pkcs7

水平有限,若有错误,欢迎指正


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (8)
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢楼主
2016-2-21 21:15
0
雪    币: 158
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
./obj/local/arm64-v8a/libz.a(ioapi.o): In function `fopen64_file_func mk文件参数是啥,编译出错
直接打开apk 提示"open apk file error! "
2016-2-22 14:38
0
雪    币: 1593
活跃值: (2950)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
我这次只是在Windows和linux编译了,但这个问题我之前遇到过,在ioapi.h添加一行宏
上传的附件:
2016-2-22 15:54
0
雪    币: 465
活跃值: (398)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢楼主的分享。
2016-2-22 16:12
0
雪    币: 246
活跃值: (264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢分享
2016-3-13 14:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢lz分享 。
2016-3-14 22:27
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
谢谢分享,这种资料恐怕是第一份这么完整的描述签名信息了,谢谢楼主的分享,但是楼主哦,你太粗心了。有两个地方写错了
1、你的图跟你标注的类型,有个地方写错啦,,subject:证书主体是,tag=30是SEQUENCE类型,
2、length=0x34<<8|0x56这里啊,我看你画的图推测,length应该是0x34<<16|0x56
2016-6-7 15:54
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
贴上一份自己弄的demo跟着楼主学习的过程,希望方便以后学习的人
主要分析
CERT.RSA
PKCS7是采用DER编码的,用{tag,lenght,data}表示,tag

{tag,length,data}
tag占一个字节,比如看见0x2,就表示是INTEGER类型
tag        VALUE
INTEGER    0x02  
BITSTRING  0x03             位字符串  
OCTETSTRING  0x4         字节字符串
ObjectIdentifier 0x06       该类型可以理解为整数数组
SEQUENCE   0x30             类似于c的struct
SET        0x31             类似于c语言的union

length 我们把第一个字节叫做lenbyte
若高位为1,则后面7位表示length所占的字节长度
若高位是0,则lenbyte就是长度
如,82 34 56 .. ,由于lenbyte=0x82得到最高位是1,则0x82&0x7f=2,说明2个字节长度,
则length=0x34<<8|0x56=0x3456

length后面紧接着data
==============================================================
==============================================================
ConetntInfo SEQUENCE类型
0x00-0x37B  30 82 03 78 .. ... ..
30表示是SEQUENCE类型
82最高位是1,则长度是0x378
Length=0x378
Data下面结构
==============================================================
contentType :ObjectIndentifier类型  signedData
0x04-0x0E 06 09 2A 86 48 86 F7 0D 01 07 02
Length=0x9
==============================================================
未知区域
0x0F-0x12  A0 82 03 69
==============================================================
content:(SEQUENCE类型)可选
0x13-0x    30 82 03 65 .....
Length=0x365
Data下面结构
==============================================================
version :(INTEGER类型) 版本信息,是整数类型,当前版本为1
0x17-0x19   02 01 01
02表示是INTEGER类型
lenbyte=01,高位是0,则,01
Data 为1,也就是说version为1
=================================================================
digestAlgorithms : (SET类型),消息摘要算法,表示是多个消息摘要中的一个
0x1A-0x26   31 0B 30 09 06 05 2B 0E 03 02 1A 05 00 30
0X31表示是SET类型
Lenbyte=0B,表示data长度是11
Data   30 09 06 05 2B 0E 03 02 1A 05 00
=================================================================
ContentInfo: (SEQUENCE类型)
0x27-0x33  30 0B 06 09 2A 86 48 86 F7 0D 01 07 01
0x30表示SEQUENCE类型
Lenbyte=0B,表示data长度是11
Data   06 09 2A 86 48 86 F7 0D 01 07 01

0x34-0x37  A0 82 02 35   这是什么鬼未知未知?????????????????????
==============================================================================
certificates:(SEQUENCEl类型) 证书部分 可选
certificates分为个三部分,tbsCertificate是证书的核心部分,signatureAlgorithm和signatureVale是对他进行
数字签名,保证核心部分不被修改
0x38-0x26C   30 82 02 31 .....
0x30表示SEQUENCE类型
Lenbyte=0x82,高位为1,表示长度是
0x2<<16|0x31=0x26C  
Data就是下面的结构

tbsCertificate:(SEQUENCE类型)部分,证书的序列号、证书颁布者和主体,证书有效期和公钥
0x3C-0x1D9    30 82 01 9A......
0x30表示是SEQUENCE类型
长度是0x19A
Data是下面结构

0x40-0x41  A0 03   这是什么鬼未知未知?????????????????????

Version :(INTEGER类型)          版本信息,整数类型
0x42-0x44   02 01 02
Tag=02是 INTEGER类型
Length=0x1
Data=0x2  ,version=-0x2
serialNumber:(INTEGER类型)  证书的序列号,是整数类型,是由证书颁布者分配
0x45-0x4A  02 04 57 56 19 2B  
Tag=2
Length=0x4
Data= 57 56 19 2B

signature: (SEQUENCE类型)          对tbsCertificate进行数字签名算法,和下面signatureAlogorithm的值一致
0x4A-0x59  30 0D 06 09 2A 86 48 86 F7 0D 01 01 05 05 00
Data=06 09 2A 86 48 86 F7 0D 01 01 05 05 00
issuer:(SEQUENCE类型)标错了                   整数颁布者信息,issuer和上面serialNumber唯一确定证书
0x5A-0xB8    30 5D
DATA部分如下
310D300B0603550406130433313233310B300906035504081302313231123010060355040713096775616E677A686F75310D300B060355040A1304736E6F77310D300B060355040B1304736E6F77310D300B060355040313047A686F75

validity: (SEQUENCE类型)           证书的有效期,有开始时间和截止时间
0xB9-0xD8 30 1E 17 0D 31 36 30 3630373030343533315A170D3236303630353030343533315A
可以看见data部分,

subject:(SET类型)            证书主体的信息
0xD8-0x137  30 5D ..

利用的keystore对照

subjectPublicKeyInfo: (SEQUENCE类型) 证书公钥信息,包含有加密算法和公钥
0x138-0x1D9   30 81 9F ...
Data部分

issuerUnqueID和subjectUniqueID 主要是对证书颁布者或证书主体多个引用时使,可选的
由于tbsCertificate的尾部范围是0x1D9知道这里是空

extensions: (SEQUENCE类型) 可选
由于tbsCertificate的尾部范围是0x1D9知道这里是空

-----------------------------------------------------------------------
signatureAlgorithm部分 ,是签名加密算法,常用的有SHA256wITHRSA,signatureValue,SHA1withRSA
0x1DA-0x1E8   30 0D 06 09 2A 86 48 86 F7 0D 01 01 05 05 00
签名算法 用的是SHA1withRSA
-----------------------------------------------------------------------
SignatureVal:(BITSTRINGl类型)
0x1E9-0x26C   03 81 81 ....

==============================================================================
crls:(SET类型) 证书吊销列表

==============================================================================
signerInfos:(SET类型) 签名者信息
0x26D-0x37B  31 82 01 0B 30 ..
Length=0x10B
Data下面结构

signerInfo:(SEQUENCE类型)
0x271-0x37B   30 82 01 07
Length=0x107
Data是下面结构
Verison 版本信息
0x275-0x277   02 01 01  
Length=0x1
Data=0x1

issuerAndSerialNumber: (SEQUENCE类型) 证书颁布者和序列号
0x278-0x2DE   30 65 30 5D....
Length=0x65
Data如下

digestAlgorithmld : (SEQUENCE类型)生成消息摘要的算法
0x2DF-0x2E9 30 09 06 05 2B 0E 03 02 1A 05 00
Length=0x9

authenticatedAttributes可选


digestEncryptionAlgorithmld: (SEQUENCE类型) 签名算法
0x2EA-0x2F8    30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00

encrytedDigest:OCTETSTRING 私钥加密后的数据
0x2F9-0x37B 04 81 80 0A ...
Length=0x80
Data如下

unauthenticatedAttributes可选
2016-6-7 15:57
0
游客
登录 | 注册 方可回帖
返回
//