我们知道,解压APK后在META-INF\目录下有三个文件:
MANIFEST.MF
CERT.SF
CERT.RSA为了说明方便,我取.MF和.SF里的其中一条文件记录进行说明。
比如:
MANIFEST.MF里有一条是这样的Name: assets/domob_next_off.png
SHA1-Digest: grInRNpOLXjWa5hDSdT5DS/AaLg=那么这个SHA1-Digest计算方法为: BYTE pdata[20];
SHA("assets/domob_next_off.png", pdata)
base64_str = base64encode(pdata),就会得到那个"grInRNpOLXjWa5hDSdT5DS/AaLg="
没什么问题。在CERT.SF里也有对应这个文件的一条:
Name: assets/domob_next_off.png
SHA1-Digest: MlJzFQET8ux3C8iVIWPRnYCt50c=我的问题是:那么这条SHA1-Digest是如何计算得到的?
是不是这样的:
BYTE pdata[20];
SHA("assets/domob_next_off.png", pdata)
psign_data = rsa_sign(pdata, pivate_key),base64_str = base64encode(psign_data),
但是看结果好像不会得到"MlJzFQET8ux3C8iVIWPRnYCt50c=",连base64计算结果的长度都不对。
请教下,SF里的那条SHA1-Digest具体生成算法是怎么样的?
MANIFEST.MF
CERT.SF
CERT.RSA为了说明方便,我取.MF和.SF里的其中一条文件记录进行说明。
比如:
MANIFEST.MF里有一条是这样的Name: assets/domob_next_off.png
SHA1-Digest: grInRNpOLXjWa5hDSdT5DS/AaLg=那么这个SHA1-Digest计算方法为: BYTE pdata[20];
SHA("assets/domob_next_off.png", pdata)
base64_str = base64encode(pdata),就会得到那个"grInRNpOLXjWa5hDSdT5DS/AaLg="
没什么问题。在CERT.SF里也有对应这个文件的一条:
Name: assets/domob_next_off.png
SHA1-Digest: MlJzFQET8ux3C8iVIWPRnYCt50c=我的问题是:那么这条SHA1-Digest是如何计算得到的?
是不是这样的:
BYTE pdata[20];
SHA("assets/domob_next_off.png", pdata)
psign_data = rsa_sign(pdata, pivate_key),base64_str = base64encode(psign_data),
但是看结果好像不会得到"MlJzFQET8ux3C8iVIWPRnYCt50c=",连base64计算结果的长度都不对。
请教下,SF里的那条SHA1-Digest具体生成算法是怎么样的?
根据SHA-1算法得到文件的摘要,标准SHA-1的输出位数为160bit
SHA("assets/domob_next_off.png", pdata) 这个pdata应该就是摘要
然后经过BASE64编码 就会得到结果 但是第二个问题里 你直接使用psign_data = rsa_sign(pdata, pivate_key),
pivate_key应该不对,感觉会是私钥和某个固定的值混合的或者某种算法生成的
不知道你的pivate_key是什么内容 还有rsa_sign我也不清楚具体的计算过程和方法 LZ可以讲讲rsa_sign是怎么计算的
也就是说CERT.SF文件是使用了私钥得到的,而MANIFEST.MF没有使用密钥信息,
而CERT.RSA肯定是要用公钥得到的
SHA1-RSA "grI.....AaLg=" KEY "MlJzFQET8ux3C8iVIWPRnYCt50c="
楼上的意思是先对文件"assets/domob_next_off.png"做SHA1,
然后再用私钥对这个hash值签名.
然后再base64?
就是sha1做完再用私钥签名?
我的理解就是CERT.CF文件因为要校验签名的正确性,那么是这样计算的:
1.先对文件做sha1,得到一个固定的hash值
2.再用rsa算法,私钥进行签名,但是这样就有一个问题,
用rsa算法得到的长度应该是大于hash值的,不会固定长度
3.那么再做base64就会得到一个比MAINFEST.MF里长的多的base64字串,但是看结果CERT.CF里的每个base64结果都一样长且和MAINFEST.MF一样,我就感觉比较奇怪,这个CERT.CF里每个值的由来。比较CF和MF两个文件里的毎对base64值,长度都一样。
我的理解就是CERT.CF文件因为要校验签名的正确性,那么是这样计算的:
1.先对文件做sha1,得到一个固定的hash值
2.再用rsa算法,私钥进行签名,但是这样就有一个问题,
用rsa算法得到的长度应该是大于hash值的,不会固定长度
3.那么再做base64就会得到一个比MAINFEST.MF里长的多的base64字串,但是看结果CERT.CF里的每个base64结果都一样长且和MAINFEST.MF一样,我就感觉比较奇怪,这个CERT.CF里每个值的由来。比较CF和MF两个文件里的毎对base64值,长度都一样。
我查了下文档 先摘要 得到MAINFEST.MF里面的内容 然后通过密钥加密MAINFEST.MF 得到CERT.CF 解密时 使用公钥 解析CERT.CF 与MAINFEST.MF 对比