Comment puis-je sha1 une chaîne ou un ensemble de nombres dans l'objectif c?
Réponses
Trop de publicités?CommonCrypto (une Pomme cadre) a des fonctions pour calculer les hachages SHA-1, comprenant une étape de hachage:
#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, nous supposons que vous voulez dire un tableau d'entiers de longueur connue. Pour ces données, il est plus facile de construire itérativement les digérer plutôt que d'utiliser le one-shot de la fonction:
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 ce ne soit pas l'endianness en compte. Le SHA-1 calculé avec ce code sur un PowerPC système est différent de celui calculé sur un i386 ou système de BRAS. La solution est simple-swap les octets des nombres entiers à l'endianness 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));
}
Une autre solution avec un message digest de la bibliothèque (nv-ios-digest):
(1) Chaîne de caractères
// 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) Numéros
// 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];
Le message digest de la bibliothèque de prise en charge de MD5, SHA-1, SHA-224, SHA-256, SHA-384 et SHA-512.
[Blog] des résumés de Message (MD5, SHA1, etc.) sur iOS avec des classes
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html
[Bibliothèque] nv-ios-digest
https://github.com/TakahikoKawasaki/nv-ios-digest
SHA1 n'est pas fourni avec Objective-C. Vous pouvez utiliser le code source C pour hashdeep
et amis, qui est sous licence dans le domaine public (car il a été écrit par un employé du gouvernement des États-Unis): http://md5deep.sourceforge.net/ .