HmacSHA256 target-c шифрование - PullRequest
       40

HmacSHA256 target-c шифрование

4 голосов
/ 11 октября 2011

Я хочу зашифровать строку ключом, используя HmacSHA256. Код, который все используют, приведен ниже, но есть одна вещь, которая не имеет смысла. Зачем нам использовать base64 в конце, если все, что мы хотим, это хеш HmacSHA256?

Я пытался увидеть хеш, сгенерированный после вызова метода CCHmac с

NSString *str = [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);

Но я не получаю сгенерированный хеш, я получаю ноль или мусор, как это:

2011-10-11 09: 38: 05.082 Hash_HmacSHA256 [368: 207] (ноль) 2011-10-11 09: 38: 05.085 Hash_HmacSHA256 [368: 207] Rwªb7iså {yyþ§Ù (& oá ÷ ÛËÚ ¥ M`f

import < CommonCrypto/CommonHMAC.h>

NSString *key;
NSString *data;

const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                  length:sizeof(cHMAC)];

NSString *hash = [HMAC base64Encoding]; //This line doesn´t make sense

[key release];
[data release];

Ответы [ 3 ]

8 голосов
/ 11 октября 2011

Прежде всего, для тех, кто интересуется, это относится к моему ответу на этот вопрос: Пример кода Objective C для HMAC-SHA1


HMAC, который вы генерируетеявляется 256-битным двоичным значением, которое может начинаться или не начинаться с байта 0.

Чтобы иметь возможность его распечатать, вам нужно строковое представление (двоичное, шестнадцатеричное, десятичное, base64 и т. д.).Base64 является одним из наиболее эффективных среди них, поэтому я использовал там кодировку Base64.

Причина, по которой вы получаете мусор, заключается в том, что большинство (если не все) октетов в значении HMAC находятся за пределами диапазонапечатные символы ASCII.Если первый октет равен 0 (0x00), вы получите ноль.Вот почему вам нужна кодировка, которая поддерживает произвольные значения.ASCII этого не делает.

Конечно, если вы не хотите печатать значение HMAC, вам может не понадобиться такая кодировка, и вы можете сохранить HMAC как есть (двоичные данные NSData).

2 голосов
/ 12 октября 2011

Я провожу целый день, пытаясь преобразовать сгенерированный хеш (байты) в читаемые данные.Я использовал закодированный base64, который вы сказали, и он не работал для меня.

1 голос
/ 14 июля 2012

Не используйте "[out description]", чтобы получить хеш в виде строки.

Выполните [hash base64Encoding], чтобы получить его кодировку base64.Используйте http://cybersam.com/ios-dev/http-basic-access-authentication-with-objective-c-and-ios/attachment/nsdataadditions, чтобы получить функцию base64Encoding.Класс дополнений является категорией, которая добавляет функцию base64Encoding к реализации NSData.

Или вы можете сделать [[NSString alloc] initWithData: out encoding: NSUTF8StringEncoding].

...