Xcode ios HMAC SHA 256 хеширование - программирование
Подтвердить что ты не робот

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

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

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

Необходимо создать хэш HMAC SHA256 в Objective C, как в Java

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

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

Спасибо!

4b9b3361

Ответ 1

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];

Ответ 2

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

Это легко адаптируется к другим типам хэшей, изменяя 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

Ответ 3

+ (NSString *)hmacSHA256EncryptString{


    NSString * parameterSecret = @"input secret key";
    NSString *plainString = @"input encrypt content string";
    const char *secretKey  = [parameterSecret cStringUsingEncoding:NSUTF8StringEncoding];
    const char *plainData = [plainString cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, secretKey, strlen(secretKey), plainData, strlen(plainData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
    const unsigned char *bufferChar = (const unsigned char *)[HMACData bytes];
    NSMutableString *hmacString = [NSMutableString stringWithCapacity:HMACData.length * 2];
    for (int i = 0; i < HMACData.length; ++i){
        [hmacString appendFormat:@"%02x", bufferChar[i]];
    }
    return hmacString;
    
}