我正在研究与Android设备上的软件组件(具体来说,apk文件)的证明相关的概念证明。为此我做了以下事情:
我以编程方式检索了安装在Android平板电脑上的应用程序(例如maps.apk)的META / CERT.SF中存储的摘要,属于AndroidManifest.xml,resources.arsc和classes.dex。
然后,我计算了这些文件的SHA-1摘要,之后在这些摘要上做了base64。我能够将这些与第1步中的匹配。
我的问题是,存储在META-INF / CERT.RSA中的公钥的作用在哪里?是不是存储在META-INF / CERT.SF中的摘要应该由与META-INF / CERT.RSA中的公钥对应的私钥签名?
答案 0 :(得分:1)
真正的问题是:CERT.SF的作用是什么?
文件CERT.SF不包含签名数据,但它仅从MANIFEST.MF构建。这意味着它不包含任何无法从MANIFEST.MF中提取的信息。
CERT.RSA或CERT.DSA(取决于所使用的算法)文件包含CERT.SF的实际签名。要从CERT.SF构建CERT.RSA,需要私钥......
- 编辑 -
对不起。我第一次读你的问题,我以另一种方式理解它。
检查存档完整性的第一步是检查CERT.SF中的哈希值是否正确。下一步是检查CERT.SF本身是否已被修改。
这是使用CERT.RSA完成的,可以通过两种方式完成:
如果您拥有该文件签名者的公钥,请使用此密钥检查签名;您忽略RSA文件中的公钥。在这种情况下,您确定该文件已被使用其私钥签名的人修改过。
RSA文件始终包含公钥和此密钥所有者的名称/地址。此信息使用(相同或另一个)私钥进行签名。如果可以信任在RSA文件中签名密钥/名称的个人/组织,并且您拥有该组织的公钥,则至少知道该文件中的名称/地址是上次修改该文件的人。
对于“自签名证书”(您没有可信任的公钥),无法检查文件......
签名不用于检查文件是否未更改。这可以通过散列manifest.mf来完成。拥有私钥的人可以以任何方式修改软件!
马丁