繁体   English   中英

从 NSData 打印 NSString 并比较 HMAC 哈希

[英]Printing NSString from NSData & comparing HMAC hashes

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

我认为这里的问题是HMACWithAlogorithm:返回构成摘要的原始字节,而不是构成摘要字符串 UTF8 编码的字节。 这是基于HMACWithAlgorithm的假设:在后台使用CCHmac库中的CommmonCrypto

我认为以下可能会做你想做的,它将返回原始摘要并将其转换为摘要的十六进制编码 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);

你的第二个想法 (hmacStr1) 很好。 如果该字符串是 null,那么它会对您的输入数据产生怀疑。

看看当你这样做时会发生什么:

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]);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM