2013-11-10 37 views
2

我正在做HMAC-SHA256編碼。試過但沒有找到任何解決方案。CCHmac上的EXC_BAD_ACCESS

#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

什麼是在調試器中顯示的錯誤? –

+0

它什麼也沒有顯示。不是一個單詞,只是在此行上顯示EXS_BAD_ACCESS –

+0

不要命名字符串變量和參數「data」,這隻會使程序難以理解。 – zaph

回答

9

cStringUsingEncoding:NSASCIIStringEncoding如果字符串包含非ASCII字符,則可以返回NULL。 因此,您應該檢查是否cKey == NULLcData == NULL

或者更好,轉換爲UTF-8字符串:

const char *cKey = [key UTF8String]; 
const char *cData = [data UTF8String]; 
+0

謝謝,但它不工作 –

+2

@MuhammadSaadAnsari:輸入值'key'和'data'是什麼?你有沒有檢查'cKey'或'cData'是否爲NULL? –

+0

令我驚訝的是,人們來到SO並提出問題,甚至沒有在問題周圍添加NSLog語句。 – zaph

1

我跑了,沒有錯誤檢弦OP的代碼,這樣的誤差必須輸入。一個或多個輸入是零或非ASCII。

請提供失敗的示例輸入。

順便說一句,這是沒有必要使用字符的字符串,這裏是使用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);