2012-04-11 87 views
3

我有一個使用HMAC算法哈希的NSData。我想打印結果字符串&看看它是如何看起來,但我所有的時間(null)打印在屏幕上。我嘗試了2種方法,但沒有奏效。有人可以建議如何打印散列的數據字符串?我想比較用這種方式創建的散列與在服務器上創建的散列是JAVA。現在,JAVA返回一個字符串對象。這將如何與NSData的創建比較客觀C.從NSData打印NSString&比較HMAC哈希

NSData *hmac = [aData HMACWithAlgorithm:kCCHmacAlgSHA1]; 
NSString *hmacStr = [NSString stringWithUTF8String:[hmac bytes]]; 
NSString *hmacStr1 = [[NSString alloc] initWithData:hmac 
               encoding:NSUTF8StringEncoding]; 
NSLog(@"Hashed Data=%@ data2=%@",hmacStr,hmacStr1); 

回答

4

我相信這裏的問題是,HMACWithAlogorithm:返回構成摘要的原始字節,而不是組成字符串UTF8編碼的字節。這是基於以下假設:HMACWithAlgorithm:正在使用CommmonCrypto庫中的CCHmac

我認爲有以下可能會做你想要什麼,將採取原始消化返回並將其轉換成編碼摘要的NSString的十六進制:

NSData *hmac = [aData HMACWithAlgorithm:kCCHmacAlgSHA1]; 

// Get a pointer to the raw bytes of the digest 
unsigned char *digest = (unsigned char *)[hmac bytes]; 

// Convert the bytes to their hex representation 
NSString *hmacStr = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
       digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], 
       digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15], 
       digest[16], digest[17], digest[18], digest[19]];  


NSLog(@"Hashed Data=%@",hmacStr); 
0

你的第二個想法(hmacStr1)的罰款。如果該字符串爲空,那麼它會對輸入數據產生懷疑。

見,當你這樣做會發生什麼:

NSLog(@"about to hash %@, which is %d bytes long", aData, [aData length]); 
NSData *hmac = [aData HMACWithAlgorithm:kCCHmacAlgSHA1]; 
NSLog(@"the hash result is %@, which is %d bytes long", hmac, [hmac length]); 

空數據,對不對?修復需要在轉換爲字符串之前發生。

+0

這是第二個print語句的結果 - >哈希結果是,它是20字節長 – Abhinav 2012-04-11 05:03:40

+0

然後你記錄hmacStr1並且它是空的?對不起。我很難過。只是一個想法:你從服務器獲取java哈希值?當它是http結果體時,它也會是NSData。 NSData實現比較:,但無論如何,我很驚訝,字符串不起作用 – danh 2012-04-11 05:26:00