在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文件夹并造成严重破坏。这就是我在应用程序启动时需要校验和机制的原因。
答案 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是单向函数。