2016-01-27 1 views
2

En Objective C, comment puis-je obtenir une somme de contrôle pour un dossier OSX et son contenu (qui peut également avoir plusieurs sous-dossiers)? De préférence, j'aimerais obtenir la valeur sha512.Comment puis-je obtenir une somme de contrôle de dossier OSX dans Objective C?

Dans Bash, je peux le faire comme ceci:

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

... Cependant, on peut remplacer la commande shasum avec leur propre version et défaire ce que je suis en train de faire.

CONTEXTE:

J'utilise le widget OSX natif webkit pour l'interface graphique de mon application OSX. Cela tire de file:// sur un dossier appelé MyApp.app/Resources/html. Pour résister à certains virus hacking malveillants MyApp.app, je prévois d'avoir un info.plist avec une valeur sha512 dedans (qui sera cryptée bien sûr). Lorsque l'application démarre, elle calcule la valeur sha512 de MyApp.app/Resources/html, puis la chiffre de la même manière que ma valeur info.plist, puis compare les deux valeurs pour voir si elles sont identiques. Sinon, l'application a été compromise. Je vais alerter l'utilisateur avec une boîte de dialogue et fermer l'application.

Questions répondues

Q1. Ne devra-t-il pas être crypté d'une manière ou d'une autre pour empêcher la falsification de la valeur sauvegardée dans Info.plist? - mipadi

A1. Oui, avant de stocker dans Info.plist, il sera crypté. Je l'ai dit ci-dessus. Je peux gérer l'étape de cryptage en utilisant la bibliothèque Crypto.

Q2. Les fichiers de l'application (répertoire de ressources) n'ont pas d'autorisations d'écriture. Si vous cryptez vers où allez-vous enregistrer la clé de cryptage? - zaph

A2. Au moment de la compilation, dans les étapes de compilation, je vais avoir un script Bash calculer la somme de contrôle sha512, le chiffrer, et mettre à jour le Info.plist.

Q3. Si les fichiers de l'application ne peuvent pas être écrits, à quoi sert la somme de contrôle? - mipadi

A3. Mon application ne réécrit pas dans le dossier Resources/html. Il stockera l'état de la session à l'aide de la stratégie de paramétrage par défaut que Apple encourage pour toutes les applications. Au lieu de cela, ce que je crains est un virus qui infecte le dossier Resources/html, en le remplaçant par de mauvaises choses, et fait apparaître l'application comme normale mais qui fait quelque chose de dangereux en arrière-plan. C'est là que la somme de contrôle peut aider - elle peut aider à empêcher la falsification après l'installation de l'application.

Q4. J'ai supposé que le demandeur n'utilisait pas la signature de code (pour une raison quelconque), puisque la signature de code couvre déjà ceci. - mipadi

A4. Si vous demandez pourquoi je ne me fie pas uniquement à la signature de code, c'est parce que, après que l'application a été marquée comme approuvée, le virus peut entrer dans le dossier Resources/html et provoquer des dégâts. C'est pourquoi j'ai besoin du mécanisme de checksum lors du démarrage de l'application.

+0

Le calcul du shasum du fichier sera suffisant. Et cette réponse de pile couvre probablement ce que vous essayez de faire: http://stackoverflow.com/questions/6228092/how-can-i-compute-a-sha-2-ideally-sha-256-or-sha-512 -hash-in-ios –

+0

@CliffRibaudo J'ai besoin de cela sur tous les fichiers dans le dossier, pas seulement un fichier. Y a-t-il une routine pour le faire récursivement? – Volomike

+0

Votre ensemble d'applications est-il signé (à l'aide de l'outil 'codesign')? – mipadi

Répondre

1

Vous pouvez utiliser la méthode FileManager:

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

Voir la documentation Apple pour exemple de code.
ou

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

à recenseur tous les fichiers dans le chemin.

Créer une instance SHA512 avec fonction commune Crypto:

CC_SHA512_Init(CC_SHA256_CTX *c) 

pour chaque fichier mise à jour énumérés:

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

avec:

CC_SHA512_Final(unsigned char *md, CC_SHA256_CTX *c) 

Il n'y a pas besoin de chiffrer la SHA512 sortie depuis SHA est une fonction à sens unique.

+0

N'aura-t-il pas besoin d'être crypté d'une manière ou d'une autre pour empêcher la falsification de la valeur enregistrée dans 'Info.plist'? – mipadi

+0

Les fichiers de l'application (répertoire de ressources) ne disposent pas d'autorisations d'écriture. Si vous cryptez vers où allez-vous enregistrer la clé de cryptage? – zaph

+0

Si les fichiers de l'application ne peuvent pas être écrits, à quoi sert la somme de contrôle? – mipadi