HmacSHA256 objective-c加密

bru*_*uno 4 iphone encryption objective-c sha256 hmac

我想使用HmacSHA256用钥匙包裹一个字符串.每个人使用的代码都是下面的代码,但有一件事没有意义.如果我们想要的只是HmacSHA256哈希,为什么我们最终会使用base64?

我试着看到在调用方法CCHmac之后生成的哈希

NSString *str = [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);
Run Code Online (Sandbox Code Playgroud)

但我没有得到生成的哈希,我得到null,或垃圾,像这样:

2011-10-11 09:38:05.082 Hash_HmacSHA256 [368:207](null)2011-10-11 09:38:05.085 Hash_HmacSHA256 [368:207]Rwªb7iså{yyþ§Ù(&oá÷ÛË¥M`f

import < CommonCrypto/CommonHMAC.h>

NSString *key;
NSString *data;

const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                  length:sizeof(cHMAC)];

NSString *hash = [HMAC base64Encoding]; //This line doesn´t make sense

[key release];
[data release];
Run Code Online (Sandbox Code Playgroud)

Can*_*der 8

首先,对于那些想知道的人,这是参考我对这个问题的回答:HMAC-SHA1的Objective-C示例代码


您生成的HMAC是256位二进制值,可能以0字节开头也可能不以0字节开头.

为了能够打印它,您需要一个字符串表示(二进制,十六进制,十进制,base64等).Base64是其中最有效的之一,这就是我在那里使用Base64编码的原因.

你得到垃圾的原因是HMAC值中的大多数(如果不是全部)八位字节都在可打印的ASCII字符范围之外.如果第一个八位位组为0(0x00),则为零.这就是您需要支持任意值的编码的原因.ASCII没有.

当然,如果您不想打印HMAC值,则可能不需要这样的编码,并且可以保持HMAC不变(二进制NSData).