xcode ios HMAC SHA 256哈希

时间:2013-01-25 05:58:49

标签: ios objective-c cryptography hmac sha256

所以我试图找出如何在ios上执行hmacshad256哈希,因为这是我为我所做的wcf服务api做的哈希。我一直在尝试寻找有关它的一些信息,但通常最终会得到一个SHA-256哈希。

这是我唯一的参考资料:

Need to generate HMAC SHA256 hash in Objective C as in Java

我不确定这是否是唯一的方法(导入java hmac类)

感谢任何帮助。

谢谢!

3 个答案:

答案 0 :(得分:33)

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>

从iOS 7.0开始base64Encoding is deprecated,最后一行应为:

NSString *base64Hash = [hash base64EncodedStringWithOptions:0];

答案 1 :(得分:5)

以下是我提交的解决方案,我从其他答案中提出了这个问题:

通过更改CC_SHA256_DIGEST_LENGTH和kCCHmacAlgSHA256,可以很容易地适应其他哈希类型。

如果您对此感兴趣,请查看CommonCrypto库中的CommonDigest.h文件。

#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

上测试过

答案 2 :(得分:2)

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