2010-08-12 10 views
29

Wie kann ich eine Zeichenfolge oder einen Satz von Zahlen in Objective c sha1?Ziel C: SHA1

+0

Diese Frage ist auffallend ähnlich http://stackoverflow.com/questions/756492/objective-c-sample-code-for-hmac-sha1. Noch keine Antworten da drüben, aber ich poste der Vollständigkeit halber. – Eli

+0

Ist dies für eine bestimmte Plattform? – ThomasW

+0

@ThomasW Mac OS X nur – Daniel

Antwort

61

CommonCrypto (ein Apple-Framework) hat Funktionen für die Berechnung der SHA-1-Hashes, darunter ein einstufiges hash:

#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'. */ 
    ... 
} 

Für eine Reihe von Zahlen, lassen Sie uns annehmen, dass Sie eine Reihe von Ints bekannten bedeuten Länge. Für solche Daten, ist es einfacher, iterativ den Digest eher zu konstruieren als der Schuss one-Funktion verwenden:

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'. */ 
... 

Beachten Sie, dass dies nicht endianness nicht berücksichtigt. Die mit diesem Code auf einem PowerPC-System berechnete SHA-1 wird sich von der auf einem i386- oder ARM-System berechneten SHA-1 unterscheiden. Die Lösung ist einfach - Swap den Bytes der ganzen Zahlen zu einem bekannten endianness vor der Berechnung zu tun:

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

Common Crypto ist kein Teil des SDK mehr – Daniel

+1

Ab 4.0.2 ist es ja. Probieren Sie es aus! –

+1

Natürlich ist das eine iOS-spezifische Sache. Es kommt nicht mit der Objective-C-Sprache. –

2

SHA1 kommt eigentlich nicht mit Objective-C. Sie können den C-Quellcode für hashdeep und Freunde verwenden, der unter der Public Domain lizenziert ist (weil er von einem Angestellten der Regierung der Vereinigten Staaten geschrieben wurde): http://md5deep.sourceforge.net/.

+0

Eine andere Option wäre libgcrypt, von den Machern von GnuPG (http://www.gnupg.org/related_software/libraries.en.html#lib-libgcrypt). – schot

+0

Gibt es eine sichere Verschlüsselung, die direkt für obj c und php unterstützt wird? – Daniel

+1

@schot: Aber libcrypt hat eine viel restriktivere Lizenz. @Daniel: Nicht aus der Box, nein. Objective-C kommt Bibliotheken nicht in den Weg. –

4

Eine andere Lösung mit einer Message-Digest-Bibliothek (nv-ios-Digest):

(1 String)

// 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) Zahlen

// 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]; 

Die Message Digest-Bibliothek unterstützt MD5, SHA-1, SHA-224, SHA-256, SHA-384 und SHA-512.

[Blog] Nachricht verdaut (MD5, SHA1, etc.) auf iOS mit speziellen Klassen
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html

[Library] nv-ios-digest
https://github.com/TakahikoKawasaki/nv-ios-digest