我在做HMAC-SHA256编码。试过但没有找到任何解决方案。
#include <CommonCrypto/CommonHMAC.h>
- (NSString *)hmacWithKey:(NSString *)key andData:(NSString *)data
{
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
///////////////////////////////////////////////////////////////
////but on below line of code i am getting EXC_BAD_ACCESS//////
///////////////////////////////////////////////////////////////
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
//////////////////////////////////////////////
NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH];
// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [out description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
NSLog(@"%@",hash);
return hash;
}
请告诉我,我在这里做错了什么。 谢谢
答案 0 :(得分:9)
cStringUsingEncoding:NSASCIIStringEncoding
可以返回NULL
。
因此,您应该检查cKey == NULL
或cData == NULL
。
或者更好的是,转换为UTF-8字符串:
const char *cKey = [key UTF8String];
const char *cData = [data UTF8String];
答案 1 :(得分:1)
我使用没有错误的示例字符串运行OP代码,因此错误必须在输入中。输入中的一个或多个是nil或non-ascii。
请提供失败的示例输入。
顺便说一句,没有必要使用char字符串,这是一个使用NSData的例子:
NSData *cKey = [key dataUsingEncoding:NSUTF8StringEncoding];
NSData *cData = [data dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *out = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey.bytes, cKey.length, cData.bytes, cData.length, out.mutableBytes);
NSLog(@"out: %@", out);