对于亚马逊服务(S3,EC2,SimpleDB的)所有操作您需要签署与HMAC-SHA-1签名(所有resquest http://en.wikipedia.org/wiki/HMAC,http://docs.amazonwebservices.com /AWSFWS/latest/DeveloperGuide/index.html?SummaryOfAuthentication.html).
我在asp.net后端工作,没有问题.问题出在iPhone应用程序中.iPhone开发人员说,没有办法使用HMAC-SHA-1编码,他也没有办法实现自己的算法.作为程序员,我无法理解为什么会出现问题.
所以我想知道iPhone开发者是对的吗?
我从来没有为iPhone编码,所以我甚至没有在哪里搜索这样的信息.
CommonCrypto可以解决问题.
#import
然后
/* inputs: NSData *keyData; NSData *clearTextData */ uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; CCHmacContext hmacContext; CCHmacInit(&hmacContext, kCCHmacAlgSHA1, keyData.bytes, keyData.length); CCHmacUpdate(&hmacContext, clearTextData.bytes, clearTextData.length); CCHmacFinal(&hmacContext, digest); NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
CommonCrypto会做到这一点.但如果你想要代码,我在这里有一些:
http://oauth.googlecode.com/svn/code/obj-c/OAuthConsumer/Crypto/
我写的用于Cocoa OAuth实现的内容:http://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer
该文章演示了一个小功能,将产生的SHA-1散列摘要,将匹配什么,如果你给它相同的输入PHP的SHA1()函数将生成:
#import@implementation SHA1 +(NSString*) digest:(NSString*)input { const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:input.length]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes, data.length, digest); NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; return output; } @end