2010-08-12 5 views
29

Comment puis-je sha1 une chaîne ou un ensemble de nombres dans Objective c?Objectif C: SHA1

+0

Cette question est étonnamment similaire à http://stackoverflow.com/questions/756492/objective-c-sample-code-for-hmac-sha1. Pas de réponses encore là-bas, mais je poste pour l'exhaustivité. – Eli

+0

S'agit-il d'une plate-forme particulière? – ThomasW

+0

@ThomasW Mac OS x seulement – Daniel

Répondre

61

CommonCrypto (un cadre d'Apple) a des fonctions de calcul SHA-1, y compris un hachage étape:

#include <CommonCrypto/CommonDigest.h> 

unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
NSData *stringBytes = [someString dataUsingEncoding: NSUTF8StringEncoding]; /* or some other encoding */ 
if (CC_SHA1([stringBytes bytes], [stringBytes length], digest)) { 
    /* SHA-1 hash has been calculated and stored in 'digest'. */ 
    ... 
} 

Pour un ensemble de nombres, supposons que vous voulez dire un tableau de ints de connu longueur. Pour ces données, il est plus facile de construire itérativement la digestion plutôt que d'utiliser la fonction one-shot:

unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
uint32_t *someIntegers = ...; 
size_t numIntegers = ...; 

CC_SHA1_CTX ctx; 
CC_SHA1_Init(&ctx); 
{ 
    for (size_t i = 0; i < numIntegers; i++) 
     CC_SHA1_Update(&ctx, someIntegers + i, sizeof(uint32_t)); 
} 
CC_SHA1_Final(digest, &ctx); 

/* SHA-1 hash has been calculated and stored in 'digest'. */ 
... 

Notez que cela ne prend pas en compte boutisme. Le SHA-1 calculé avec ce code sur un système PowerPC différera de celui calculé sur un système i386 ou ARM. La solution est simple - échange les octets des entiers à un connu boutisme avant de faire le calcul:

for (size_t i = 0; i < numIntegers; i++) { 
     uint32_t swapped = CFSwapInt32HostToLittle(someIntegers[i]); /* or HostToBig */ 
     CC_SHA1_Update(&ctx, &swapped, sizeof(swapped)); 
    } 
+0

Crypto commun n'est plus à part du SDK – Daniel

+1

A partir de 4.0.2, oui c'est le cas. Allez-y et essayez-le! –

+1

Bien sûr, c'est une chose spécifique à iOS. Il ne vient pas avec le langage Objective-C. –

2

SHA1 n'est pas fourni avec Objective-C. Vous pouvez utiliser le code source C pour hashdeep et les amis, qui est sous licence du domaine public (Parce qu'il a été écrit par un employé du gouvernement des États-Unis): http://md5deep.sourceforge.net/.

+0

Une autre option serait libgcrypt, des fabricants de GnuPG (http://www.gnupg.org/related_software/libraries.en.html#lib-libgcrypt). – schot

+0

Existe-t-il un chiffrement sécurisé directement pris en charge par obj c et php? – Daniel

+1

@schot: Mais libcrypt a une licence beaucoup plus restrictive. @Daniel: Pas sorti de la boîte, non. Objective-C ne vient pas avec beaucoup de bibliothèques. –

4

Une autre solution avec un message bibliothèque digest (nv-ios-digest):

(1) Chaîne

// Create an SHA1 instance, update it with a string and do final. 
SHA1 sha1 = [SHA1 sha1WithString:@"Hello"]; 

// Get the pointer of the internal buffer that holds the message digest value. 
// The life of the internal buffer ends when the SHA1 instance is discarded. 
// Copy the buffer as necessary. The size of the buffer can be obtained by 
// 'bufferSize' method. 
unsigned char *digestAsBytes = [sha1 buffer]; 

// Get the string expression of the message digest value. 
NSString *digestAsString = [sha1 description]; 

(2) Nombres

// Create an SHA1 instance. 
SHA1 sha1 = [[SHA1 alloc] init]; 

// Update the SHA1 instance with numbers. 
// (Sorry, the current implementation is endianness-dependent.) 
[sha1 updateWithShort:(short)1]; 
[sha1 updateWithInt:(int)2]; 
[sha1 updateWithLong:(long)3]; 
[sha1 updateWithLongLong:(long long)4]; 
[sha1 updateWithFloat:(float)5]; 
[sha1 updateWithDouble:(double)6]; 

// Do final. 'final' method returns the pointer of the internal buffer 
// that holds the message digest value. 'buffer' method returns the same. 
// The life of the internal buffer ends when the SHA1 instance is discarded. 
// Copy the buffer as necessary. The size of the buffer can be obtained by 
// 'bufferSize' method. 
unsigned char *digestAsBytes = [sha1 final]; 

// Get the string expression of the message digest value. 
NSString *digestAsString = [sha1 description]; 

La bibliothèque de digestion de messages prend en charge MD5, SHA-1, SHA-224, SHA-256, SHA-384 et SHA-512.

[Blog] message digère (MD5, SHA1, etc.) sur iOS avec des classes dédiées
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html

[Bibliothèque] NV-ios-digèrent
https://github.com/TakahikoKawasaki/nv-ios-digest