xcode ios HMAC SHA 256 хеширование

Итак, я пытаюсь выяснить, как сделать хеш hmacshad256 на ios, поскольку это хеш, который я сделал для API службы wcf, который я сделал. Я пытался найти информацию об этом, но обычно просто получал хеш SHA-256.

Это единственная ссылка, которая у меня есть:

Необходимо сгенерировать хеш HMAC SHA256 в Objective C как в Java

И я не уверен, что это единственный способ сделать это (импорт класса java hmac)

Любая помощь приветствуется.

Спасибо!


person gdubs    schedule 25.01.2013    source источник
comment
хм .. кто-нибудь ранее убирал ответ на это?   -  person gdubs    schedule 26.01.2013
comment
Разве это не то, что вы искали? stackoverflow.com/questions/5862207 /   -  person DenNukem    schedule 15.05.2013


Ответы (2)


NSString * parameters = @"string to hash"
NSString *salt = @"saltStringHere";
NSData *saltData = [salt dataUsingEncoding:NSUTF8StringEncoding];
NSData *paramData = [parameters dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH ];
CCHmac(kCCHmacAlgSHA256, saltData.bytes, saltData.length, paramData.bytes, paramData.length, hash.mutableBytes);
NSString *base64Hash = [hash base64Encoding];

а также

#import <CommonCrypto/CommonHMAC.h>

Поскольку base64Encoding устарел с iOS 7.0, последний строка должна быть:

NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
person Juraj Antas    schedule 27.06.2013
comment
Селектор теперь будет -base64EncodedStringWithOptions: - person ff10; 17.02.2014
comment
Пожалуйста, отредактируйте свой ответ и напишите, что нам нужно добавить #import NSData + Base64.h - person SteBra; 17.06.2014
comment
@Stebra Ну, вам не нужно импортировать NSData + Base64.h. Вы можете разместить этот фрагмент кода где угодно. Но это правда, что наличие категории, расширяющей NSData, возможно, лучший способ сделать это. - person Juraj Antas; 18.06.2014
comment
Поскольку соли обычно являются общедоступными, это может вводить в заблуждение. На самом деле это секретный ключ, который вы должны там использовать! - person Raphael; 06.06.2017

Вот решение, которое я представляю, которое я собрал из других ответов по этому вопросу:

Это легко адаптировать к другим типам хэшей, изменив CC_SHA256_DIGEST_LENGTH и kCCHmacAlgSHA256.

Если вы заинтересованы в этом, просмотрите файл CommonDigest.h в библиотеке CommonCrypto.

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>

+ (NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
    const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
    NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
    for (int i = 0; i < HMACData.length; ++i){
        [HMAC appendFormat:@"%02x", buffer[i]];
    }

    return HMAC;
}

Это было протестировано на iOS 8.x и iOS 7.x.

person Alex Zavatone    schedule 24.06.2015
comment
Это предполагает, что открытый текст и ключ являются ASCII, что очень ограничивает в сегодняшней среде многих языков и даже эмодзи. Обратите внимание, что @Juraj Antas не нужен массив символов. Единственное, что предлагает эта реализация, - это шестнадцатеричный вывод вместо Base64, о чем стоит упомянуть в верхней части ответа. - person zaph; 24.06.2015
comment
Спасибо, Заф. Да, в моем случае я знаю, что они есть. - person Alex Zavatone; 02.09.2015
comment
Это ответ, поэтому в моем случае он не применим. Вместо использования NSASCIIStringEncoding просто используйте NSUTF8StringEncoding. - person zaph; 02.09.2015
comment
stackoverflow.com/users/451475/zaph, как и этот метод в настоящее время, даже при замене NSASCIIStringEncoding на NSUTF8StringEncoding он возвращает неправильный хеш с использованием высоких символов ASCII, например: ¥€£•‹›. Я работаю над исправлением. - person Alex Zavatone; 06.06.2017