我正在尝试在iOS上进行hmacshad256哈希,因为这是我为WCF服务API所做的哈希。 我一直在尝试寻找相关信息,但通常只能得到SHA-256哈希。
这是我唯一的参考资料:
需要在Objective C中生成HMAC SHA256哈希,就像Java中一样
我不确定这是否是唯一的方法(导入Java hmac类)
任何帮助都将不胜感激。
谢谢!
这是我唯一的参考资料:
需要在Objective C中生成HMAC SHA256哈希,就像Java中一样
我不确定这是否是唯一的方法(导入Java hmac类)
任何帮助都将不胜感激。
谢谢!
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
已被弃用,因此最后一行应该是:
NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
这是我从其他答案中整合而来的解决方案:
通过更改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上进行了测试。
NSASCIIStringEncoding
just use NSUTF8StringEncoding
。翻译为:这是一条回答,所以“在我的情况下”不适用。不要使用NSASCIIStringEncoding
,而是使用NSUTF8StringEncoding
。 - zaphNSASCIIStringEncoding
替换为NSUTF8StringEncoding
,在使用高ASCII字符(如¥€£•‹›
)时仍会返回错误的哈希值。我正在努力修复它。 - Alex Zavatone+ (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;
}