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

时间:2016-01-27 16:32:40

标签: objective-c macos recursion checksum sha512

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

在Bash中,我可以这样做:

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

...但是,可以用自己的版本替换shasum命令并撤消我正在尝试做的事情。

背景:

我正在使用本机OSX webkit小部件作为我的OSX应用程序的GUI。这会从名为file://的文件夹中取出MyApp.app/Resources/html。为了抵制一些恶意攻击MyApp.app的病毒,我计划在其中加上一个带有sha512值的info.plist(当然会加密)。当应用程序启动时,它将计算MyApp.app/Resources/html的sha512值,然后以与info.plist值相同的方式对其进行加密,然后比较这两个值以查看它们是否相同。如果没有,那么应用程序已被泄露。我将通过一个对话框提醒用户并关闭应用程序。

已回答的问题

Q1。是否必须以某种方式加密以防止篡改Info.plist中保存的值? - mipadi

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

Q2。应用程序(资源目录)中的文件没有写入权限。如果加密到保存加密密钥的位置? - zaph

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

Q3。如果无法写入应用程序中的文件,那么校验和的重点是什么? - mipadi

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

Q4。我认为提问者没有使用代码签名(由于某种原因),因为代码签名已经涵盖了这一点。 - mipadi

A4。如果你问为什么我不仅仅依赖于代码签名 - 那是因为在应用程序被标记为可信之后,病毒可能会进入Resources / html文件夹并造成严重破坏。这就是我在应用程序启动时需要校验和机制的原因。

1 个答案:

答案 0 :(得分:1)

您可以使用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是单向函数。