不在捆绑包中的文件的协同设计信息存储在哪里?

Where is codesign information stored for files that are not in a bundle?

我注意到我可以对任何随机文件进行数字签名:

touch ~/test
md5 ~/test
  -> MD5 (~/test) = d41d8cd98f00b204e9800998ecf8427e
codesign -vv ~/test
  ->  code object is not signed at all
codesign -s <Developer ID Certificate Hash> ~/test
md5 ~/test
  -> MD5 (~/test) = d41d8cd98f00b204e9800998ecf8427e
codesign -vv ~/test
  -> valid on disk
  -> satisfies its Designated Requirement

如果它是捆绑包,代码签名信息将存储在这里: MyBundle.app/Contents/_CodeSignature/

但是在这种情况下,没有bundle,文件的校验和没有变化,那么代码签名存储在哪里呢?

多么好的问题!

如果您触摸该文件并使用 ls 查看它,您将看到如下内容:

$ ls -la test
-rw-r--r--    1 User  staff  0 17 Oct 09:42 test

对文件进行编码并重新列出

$ ls -la test
-rw-r--r--@   1 User  staff  0 17 Oct 09:42 test

您会看到第二个列表在权限末尾有一个 @,这告诉我们有一个或多个扩展属性。

我们可以通过调用 xattr

查看数据
$ xattr -l test

然后将显示代码签名数据,该数据存储为文件的扩展属性。