【问题标题】:Verifying app's signature by code [duplicate]通过代码验证应用程序的签名[重复]
【发布时间】:2012-02-07 07:20:33
【问题描述】:

我已签署应用程序。我创建了一个identity 并使用codesign 按照Apple 的Code Signing Guide 签署我的应用程序。

现在,如何从我的应用程序中检查签名?

我需要在 Cocoa 应用(Objective-C)和用 C 编写的应用上验证这一点。

【问题讨论】:

  • 我不想阻止任何事情,我只是想从应用程序中验证我赢得的签名。
  • 我不确定我是否理解您的问题。我只需要从应用程序中检查签名。我不在乎那张支票会发生什么,我只需要验证它。如果你知道怎么做,我会很感激你的帮助。
  • @sosborn 因为是我正在编写的代码的要求。很多人问了很多问题,但没有给出任何解决方案,它只会给问题添加噪音,所以我尽量避免回答那些不相关的问题。我问的问题是一个非常直接、非常容易理解的问题。我可以在这里发布我正在编码的要求,但这不会为您提供我已经说过的更多信息。所以一直问“为什么”有什么意义。谢谢
  • @Mr Aleph,我知道当人们问“为什么”时听起来有点屈尊俯就,但我们看到很多问题,如果在原始问题中正确回答了为什么,那么答案将采用不同的方法这实际上解决了海报的问题。 Ben S 只是想给你省点麻烦。在你的情况下,这是一个要求,所以没有什么需要说的,因为你没有太多的选择。

标签: objective-c c macos cocoa digital-signature


【解决方案1】:

您可以使用NSTask 并运行“codesign --verify”并检查退出状态。当然,如果程序被修改,它可能会被修改以删除支票,所以我不确定这会给你带来什么。

如果您不担心定向篡改(例如可能会删除您对签名的检查的那种),您可以使用 codesign“kill”选项,如果您只是执行意味着签名是有效的(至少对于所有页面到目前为止已经执行了......但是如果一个尚未驻留的页面被篡改,那么当那个页面被读取时,您将被杀死)。

如果您能多解释一下为什么要验证签名,或许可以得出更好的答案。

【讨论】:

  • 谢谢,但我宁愿运行代码也不愿运行外部应用程序。
【解决方案2】:

注意:目前 MacOS X 不会在执行前验证签名代码。对于沙盒代码,这可能会有所不同,否则任何人都可以编辑权利似乎是明智的。

要从应用程序本身检查应用程序签名,请使用Code Signing Services。特别注意SecCodeCheckValidity。做检查的代码不长,但是要理解的内容比较多,所以我不会给出代码示例——你需要阅读并理解文档。

检查签名可让您的应用程序检测对其代码和资源的更改并报告其“已损坏”(很可能,并非所有更改都是恶意的)并拒绝运行。添加这样的代码当然不能保证您的代码没有损坏,但肯定会提高防止故意损坏的障碍(如果 MacOS X 开始自己进行检查,那么会有很大的胜利。

【讨论】:

  • 非常感谢。我一直在尝试使用SecStaticCodeCheckValidity,但你提到的功能更有意义。我的问题是了解我是否需要在我的应用程序中保留一份证书副本以进行验证。一段 sn-p 代码会有所帮助
【解决方案3】:

在 iOS 上实现签名验证的方式是,当启动应用程序时,launchd 守护程序使用该设备的特定私钥解密二进制文件(这就是为什么你不能只反编译应用程序或复制粘贴它们的原因从一台设备到另一台设备),如果解密失败,应用程序将无法启动。

由于 iOS 沙盒,执行此操作的本机工具在应用程序中不可用。

如果您只是想跟踪是否有人修改了您的二进制文件,您可以对其执行 MD5 或 SHA1 哈希,将其存储在 NSUserDefaults 中,并在每次应用启动时进行比较。如果哈希在执行之间发生变化,您知道它已被修改(可能是通过合法的应用程序更新或可能是恶意的。)

这里是an example,了解如何获取NSData 的哈希值。

您要查找的二进制文件是:AppName.app/AppName

【讨论】:

  • 这是针对 Mac OS X 应用程序,而不是 iOS。不过感谢您的帮助。我需要验证应用程序的签名,而不仅仅是 CRC
  • 这也适用于 iOS。 .app 格式在两者之间共享。如果您希望严格验证通过协同设计工具创建和使用的签名,这是不可能的。
  • 然而,在 Mac 上,二进制文件实际上是 AppName.app/Contents/MacOS/AppName
  • 这是否适用于启用了 BitCode 的应用程序?
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 2013-08-03
  • 2012-12-17
  • 2013-02-15
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多