如何在 Objective C 中获取 OSX 文件夹校验和?

How Do I Get an OSX Folder Checksum in Objective C?

在 Objective C 中,如何获取 OSX 文件夹及其内容(可能还有多个子文件夹)的校验和?最好,我想获得 sha512 值。

在Bash中,我可以这样做:

find /tmp/examplefolder -type f -print | xargs cat | shasum -a 512

...但是,可以用自己的版本替换 shasum 命令并撤消我正在尝试执行的操作。

背景:

我正在为我的 OSX 应用程序的 GUI 使用本机 OSX webkit 小部件。这将从 file:// 中拉出名为 MyApp.app/Resources/html 的文件夹。为了抵御某些病毒恶意入侵MyApp.app,我打算做一个info.plist,里面有一个sha512值(当然会被加密)。当应用程序启动时,它会计算MyApp.app/Resources/html的sha512值,然后像我的info.plist值一样加密,然后比较两个值是否相同。如果不是,则应用程序已受到威胁。我将通过对话框提醒用户并关闭应用程序。

回答的问题

Q1。它是否必须以某种方式加密以防止篡改 Info.plist 中保存的值? – 米帕迪

A1。是的,在存储到 Info.plist 之前,它会被加密。我在上面说了。我可以使用 Crypto 库处理加密步骤。

Q2。应用程序(资源目录)中的文件没有写权限。如果你加密到哪里,你会把加密密钥保存在哪里? – zaph

A2。在编译的时候,在编译步骤中,我会有一个Bash脚本计算sha512校验和,加密它,并更新Info.plist.

Q3。如果无法写入应用程序中的文件,那么校验和的意义何在? – 米帕迪

A3。我的应用程序不会写回 Resources/html 文件夹。它将使用 Apple 鼓励所有应用程序使用的典型用户设置策略来存储会话状态。相反,我担心的是一种病毒会感染 Resources/html 文件夹,用坏东西替换它,并导致应用程序看似正常,但在后台做一些有害的事情。这是校验和可以提供帮助的地方——它可以帮助防止应用程序安装后被篡改。

Q4。我假设提问者没有使用代码签名(出于某种原因),因为代码签名已经涵盖了这一点。 – 米帕迪

A4。如果您问我为什么不只依赖代码签名——那是因为在应用程序被标记为受信任后,病毒可以进入 Resources/html 文件夹并造成破坏。这就是为什么我需要在应用程序启动时使用校验和机制。

您可以使用 FileManager 方法:

- (NSDirectoryEnumerator<NSURL *> *)enumeratorAtURL:(NSURL *)url includingPropertiesForKeys:(NSArray<NSString *> *)keys options:(NSDirectoryEnumerationOptions)mask errorHandler:(BOOL (^)(NSURL *url, NSError *error))handler

有关示例代码,请参阅 Apple 文档。

- (NSArray<NSString *> *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError *)error

枚举路径中的所有文件。

使用 Common Crypto 函数创建 SHA512 实例:

CC_SHA512_Init(CC_SHA256_CTX *c)

对于每个文件枚举更新:

CC_SHA512_Update(CC_SHA256_CTX *c, const void *data, CC_LONG len)

完成:

CC_SHA512_Final(unsigned char *md, CC_SHA256_CTX *c)

不需要加密 SHA512 输出,因为 SHA 是一个 one-way 函数。