xcode ios HMAC SHA 256 hashing

后端 未结 3 1838
星月不相逢
星月不相逢 2021-02-01 20:30

So I\'m trying to figure out how to do a hmacshad256 hash on ios as that\'s the hash I did for the wcf service api I made. I\'ve been trying to look for some info about it but w

相关标签:
3条回答
  • 2021-02-01 21:03

    + (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;
        
    }

    0 讨论(0)
  • 2021-02-01 21:17

    Here is the solution I'm submitting that I put together from other answers on the matter:

    This is easily adapted to other hash types by changing CC_SHA256_DIGEST_LENGTH and kCCHmacAlgSHA256.

    If you're interested in doing that, check out the CommonDigest.h file within the CommonCrypto library.

    #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;
    }
    

    This has been tested on iOS 8.x and iOS 7.x

    0 讨论(0)
  • 2021-02-01 21:19
    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];
    

    and also

    #import <CommonCrypto/CommonHMAC.h>
    

    Since base64Encoding is deprecated from iOS 7.0, the last line should be:

    NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
    
    0 讨论(0)
提交回复
热议问题