3

我有一个使用 HMAC 算法散列的 NSData。我想打印结果字符串并查看它的外观,但我一直在屏幕上打印(null)。我尝试了 2 种方法,但没有奏效。有人可以建议如何打印散列数据字符串吗?我想将这种方式创建的哈希与在 JAVA 服务器上创建的哈希进行比较。现在,JAVA 返回一个字符串对象。这将如何与目标 C 创建的 NSData 进行比较。

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

2 回答 2

4

我相信这里的问题HMACWithAlogorithm:是返回构成摘要的原始字节,而不是构成摘要的字符串 UTF8 编码的字节。这是基于这样的假设HMACWithAlgorithm: : 是CCHmacCommmonCrypto引擎盖下的库中使用的。

我认为以下内容可能会满足您的要求,它将获取返回的原始摘要并将其转换为摘要的十六进制编码 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);
于 2012-04-11T05:28:33.983 回答
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]);

空数据,对吧?修复需要在转换为字符串之前进行。

于 2012-04-11T04:45:42.753 回答