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);
I spend a whole day, trying to convert the generated hash (bytes) into readable data. I used the base64 encoded solution from the answer above and it didn´t work at all for me (b.t.w. you need and an external .h to be able to use the base64 encoding, which I had).
So what I did was this (which works perfectly without an external .h):
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);
Out of interest, why do you create (unsigned char cHMAC) and then convert into (NSData) and then convert it into (NSMutableString) and then convert finally into (HexString)?
You could do this in a quicker way by cutting the middleman (i.e. without NSData and NSMutableString altogether, quicker and better performance), also changing (unsigned char) into (uint8_t []), after all they are all hex-arrays anyway!, below:
发布评论
评论(8)
以下是使用 SHA-256 生成 HMAC 的方法:
我不知道 HOTP 库,但如果我没记错的话,该算法非常简单。
Here's how you generate an HMAC using SHA-256:
I'm not aware of an HOTP library, but the algorithm was quite simple, if I recall correctly.
以下是生成 HMAC-SHA1 base64 的方法。
您需要将 Base64.h 和 Base64.m 添加到您的项目中。 您可以从此处获取它。
如果您使用ARC,它会在Base64.m中显示一些错误。 找到与此类似的行,
您需要删除自动释放部分。 最终结果应如下所示:
现在在您的常规项目中导入“Base64.h”
和下面的代码
你
会得到类似的东西:
here is how you can generate HMAC-SHA1 base64.
You need to add Base64.h and Base64.m to your project. You can get it from here.
If you use ARC, it will show some errors in Base64.m. Find the lines who are similar like this
what you need is to delete the autorelease section. The final result should look like:
Now in your general project import "Base64.h"
and the following code
With
you will get something similar to this:
这是完整的解决方案,无需任何额外的库或 hack:
您不必包含任何第三方 base64 库,因为它已经编码。
This is the complete solution which works without any extra libraries or hacks:
You don't have to include any third-party base64 library as it is already encoded.
这不需要使用自定义协议,而是使用来自的一些代码
http://cocoawithlove.com/2009/07/hashvalue -object-for-holding-md5-and.html
HashSHA256.h
HashSHA256.m
用法:
This works without using custom protocols, using some code from
http://cocoawithlove.com/2009/07/hashvalue-object-for-holding-md5-and.html
HashSHA256.h
HashSHA256.m
Usage:
这是在没有外部文件返回十六进制字符串的情况下执行此操作的方法:
它已在 iOS 7 的 xCode 5 中进行了测试,并且工作正常!
This is how yo do it without external files returning an hex string:
It was tested in xCode 5 with iOS 7 and works fine!
我花了一整天的时间,试图将生成的哈希(字节)转换为可读的数据。 我使用了上面答案中的base64编码解决方案,但它对我来说根本不起作用(顺便说一句,您需要一个外部.h才能使用我拥有的base64编码)。
所以我所做的是这样的(无需外部 .h 即可完美运行):
I spend a whole day, trying to convert the generated hash (bytes) into readable data. I used the base64 encoded solution from the answer above and it didn´t work at all for me (b.t.w. you need and an external .h to be able to use the base64 encoding, which I had).
So what I did was this (which works perfectly without an external .h):
出于兴趣,为什么要创建 (unsigned char cHMAC) 然后转换为 (NSData) 然后将其转换为 (NSMutableString) 最后转换为 (HexString)?
你可以通过削减中间人以更快的方式做到这一点(即完全没有 NSData 和 NSMutableString,更快更好的性能),还将 (unsigned char) 更改为 (uint8_t []),毕竟它们都是十六进制数组!下面:
我希望这会有所帮助,
问候
Heider Sati
Out of interest, why do you create (unsigned char cHMAC) and then convert into (NSData) and then convert it into (NSMutableString) and then convert finally into (HexString)?
You could do this in a quicker way by cutting the middleman (i.e. without NSData and NSMutableString altogether, quicker and better performance), also changing (unsigned char) into (uint8_t []), after all they are all hex-arrays anyway!, below:
I hope this helps,
Regards
Heider Sati
您看过 Jens Alfke 的新 MyCrypto 课程吗?
他的博客上有一些示例代码。
Have you seen Jens Alfke's new MyCrypto classes?
He has some sample code on his blog.