Objetivo C: SHA1
objective-c hash (3)
CommonCrypto (un framework de Apple) tiene funciones para calcular hashes SHA-1, incluyendo un hash de un paso:
#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''. */
...
}
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));
}
¿Cómo puedo sha1 una cadena o un conjunto de números en Objective c?
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/ .