首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HmacSHA256 objective-c加密

HmacSHA256 objective-c加密
EN

Stack Overflow用户
提问于 2011-10-11 16:49:07
回答 3查看 6.6K关注 0票数 4

我想用HmacSHA256加密一个带有密钥的字符串。每个人都在使用下面的代码,但是有一件事是没有意义的。如果我们想要的只是HmacSHA256散列,为什么我们最后还要使用base64呢?

我尝试查看在调用方法CCHmac之后生成的散列

代码语言:javascript
复制
NSString *str = [[NSString alloc] initWithData:HMAC encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);

但是我没有得到生成的散列,我得到的是null,或者垃圾,就像这样:

2011-10-11 09:38:05.082 Hash_HmacSHA256368:207 2011-10-11 09:38:05.085 Hash_HmacSHA256368:207 Rwªb7is M`f{yy M`f§(&oáananualalotialRanduranM`f

代码语言:javascript
复制
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];
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-11 18:50:25

首先,对于那些想知道的人来说,这是关于我对这个问题的回答:Objective-C sample code for HMAC-SHA1

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

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

得到垃圾信息的原因是HMAC值中的大多数(如果不是全部)八位字节都在可打印的ASCII字符范围之外。如果第一个二进制八位数是0 (0x00),则得到nil。这就是为什么您需要支持任意值的编码。ASCII不需要。

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

票数 8
EN

Stack Overflow用户

发布于 2011-10-12 18:03:07

我花了一整天的时间,试图将生成的哈希(字节)转换成可读的数据。我使用了你说的base64编码,但它对我一点都不起作用。

所以我是这样做的:

代码语言:javascript
复制
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

// Now convert to NSData structure to make it usable again
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);
票数 2
EN

Stack Overflow用户

发布于 2012-07-14 04:24:32

不要使用"out description“来获取字符串形式的散列。

执行散列base64Encoding以获得它的base64编码。使用http://cybersam.com/ios-dev/http-basic-access-authentication-with-objective-c-and-ios/attachment/nsdataadditions获取base64Encoding函数。additions类是一个类别,它将函数base64Encoding添加到NSData的实现中。

或者你可以做[NSUTF8StringEncoding][NSUTF8StringEncoding]。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7723469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档