通过代码验证应用程序的签名

时间:2012-01-10 21:28:15

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

我有app签名。我创建了一个identity并使用codesign按照Apple的Code Signing Guide签署我的应用。

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

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

3 个答案:

答案 0 :(得分:4)

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

要从应用程序本身检查应用程序签名,请使用Code Signing Services。特别要看SecCodeCheckValidity。执行检查的代码不长,但有很多东西需要理解,所以我不会给出代码示例 - 您需要阅读并理解文档。

检查签名允许您的应用程序检测其代码的变化。资源并报告它“受损”(很可能,并非所有变化都是恶意的)并且拒绝运行。添加这样的代码当然不能保证你的代码没有被破坏,但肯定它确实提高了对故意损害的阻碍(如果MacOS X开始自己进行检查,那么将会有很大的胜利)。

答案 1 :(得分:3)

您可以使用NSTask并运行“codesign --verify”并检查退出状态。如果程序被更改,那么可以更改它以删除支票,所以我不确定是什么给你买的。

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

也许如果你能解释一下为什么要验证签名,可以形成一个更好的答案。

答案 2 :(得分:-2)

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

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

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

以下an example介绍如何获取NSData的哈希值。

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