我们知道,解压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具体生成算法是怎么样的?

解决方案 »

  1.   

    apk 的签名都是有一个密钥文件的,如果你没有签过,那就是系统用一个调试版的自动签了。
      

  2.   

    LZ   第一个你算得是对的  第二个感觉你理解错了一步
    根据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是怎么计算的
      

  3.   

    应该是将MANIFEST.MF中对应的信息使用SHA1-RSA算法,用私钥进行签名得到的。
    也就是说CERT.SF文件是使用了私钥得到的,而MANIFEST.MF没有使用密钥信息,
    而CERT.RSA肯定是要用公钥得到的
      

  4.   

        算法 (     摘要,        私钥 ) = 结果
    SHA1-RSA  "grI.....AaLg="   KEY   "MlJzFQET8ux3C8iVIWPRnYCt50c="
      

  5.   


    楼上的意思是先对文件"assets/domob_next_off.png"做SHA1,
    然后再用私钥对这个hash值签名.
    然后再base64?
      

  6.   

    我看android调用里写的是sha1-rsa,我在想这个到底是一个什么概念的算法?是不是
    就是sha1做完再用私钥签名?
      

  7.   


    我的理解就是CERT.CF文件因为要校验签名的正确性,那么是这样计算的:
    1.先对文件做sha1,得到一个固定的hash值
    2.再用rsa算法,私钥进行签名,但是这样就有一个问题,
    用rsa算法得到的长度应该是大于hash值的,不会固定长度
    3.那么再做base64就会得到一个比MAINFEST.MF里长的多的base64字串,但是看结果CERT.CF里的每个base64结果都一样长且和MAINFEST.MF一样,我就感觉比较奇怪,这个CERT.CF里每个值的由来。比较CF和MF两个文件里的毎对base64值,长度都一样。
      

  8.   


    我的理解就是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 对比