一方面,我编写了一个小命令行实用程序,它递归地计算目录中每个文件的
md5
校验和,然后将收集到的 md5
校验和相互比较,以有效报告该子目录中的哪些文件(几乎可以肯定)每个字节都是相同的。这个功能很好用。
另一方面,我有 Apple 的
codesign
实用程序,它使用我的 Apple 开发者 ID 对文件(通常是可执行文件或共享库)进行签名,以便未来的封闭应用程序(和 Gatekeeper)的下载者可以验证文件来自我,自从我对其进行代码签名以来,没有任何不法分子偷偷地修改过该文件。
问题是,后者打破了前者。
特别是,如果我有一个文件夹,其中包含各种未签名的
Blah.app
子文件夹,每个子文件夹中都有相关的共享库,我的 md5-hasher 实用程序将准确地告诉我哪个字节- for-byte 相同的共享库文件存在于多个应用程序中。但是,如果我随后 Contents/Frameworks
文件夹中的库和可执行文件(使它们可用而不惊吓 Gatekeeper),我发现之前相同的经过代码签名的文件不再相同;也就是说,在代码签名之后,它们的 md5 哈希值现在彼此不同,因为即使原始输入文件相同,附加的代码签名数据也不同。
我的工作假设是codesign
将“当前”时间戳(从受信任的时间戳服务器收集的)嵌入到它签名的每个文件中,并且由于
codesign
在不同的时间在不同的文件上调用,这意味着大多数(或所有)代码签名文件中嵌入了不同的时间戳,这解释了为什么之前相同的文件之后具有不同的 md5 校验和。我的问题是,codesign
产生不同的输出文件(尽管输入相同)的唯一原因,还是还有其他每次都会不同的事情?
如果时间戳是唯一的原因,那么有什么方法可以指定所有codesign
调用应用的单个时间戳,这样即使在
codesign
之后,我以前相同的文件仍然是逐字节相同的已签署两者/全部?