Objetivo C: SHA1

¿Cómo puedo sha1 una cadena o un conjunto de números en Objective c?

CommonCrypto (un framework de Apple) tiene funciones para calcular hashes SHA-1, incluyendo un hash de un paso:

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

Para un conjunto de números, supongamos que se refiere a una matriz de enteros de longitud conocida. Para tales datos, es más fácil construir iterativamente el resumen en lugar de usar la función de un solo disparo:

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

Tenga en cuenta que esto no tiene en cuenta la endianidad. El SHA-1 calculado con este código en un sistema PowerPC diferirá del calculado en un sistema i386 o ARM. La solución es simple: intercambie los bytes de los enteros por una endianidad conocida antes de hacer el cálculo:

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

Otra solución con una biblioteca de resumen de mensaje (nv-ios-digest):

(1) Cadena

 // 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) Números

 // 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 biblioteca de resumen del mensaje es compatible con MD5, SHA-1, SHA-224, SHA-256, SHA-384 y SHA-512.

[Blog] Resúmenes de mensajes (MD5, SHA1, etc.) en iOS con clases dedicadas
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html

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

SHA1 en realidad no viene con Objective-C. Puede usar el código fuente C para hashdeep y amigos, que tiene licencia bajo el dominio público (porque fue escrito por un empleado del gobierno de los Estados Unidos): http://md5deep.sourceforge.net/ .