14

对于使用 Amazon 服务(S3、EC2、SimpleDB)的所有操作,您需要使用 HMAC-SHA-1 签名(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 编码过,所以我什至不知道在哪里搜索这样的信息。

4

7 回答 7

14

CommonCrypto 可以解决问题。

#import <CommonCrypto/CommonHMAC.h>

然后稍后

/*
  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];
于 2009-03-11T15:17:59.253 回答
6

CommonCrypto 会做到这一点。但是如果你想要代码,我这里有一些:

http://oauth.googlecode.com/svn/code/obj-c/OAuthConsumer/Crypto/

我写的用于 Cocoa OAuth 实现:http ://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer

于 2009-01-24T23:08:56.163 回答
5

本文演示了一个小函数,它将生成一个 SHA-1 哈希摘要,如果你给它相同的输入,它将匹配 php sha1() 函数将生成的内容

#import <CommonCrypto/CommonDigest.h>

@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
于 2010-12-23T04:05:15.160 回答
4

谷歌搜索了一下,我找到了这个文件

SHA1 的出口受(美国)联邦政府出口管制,建议出口商联系商务部出口管理局了解更多信息。

我还发现了这个

中华人民共和国和前苏联地区可​​以进口 SHA,只要它用于民用最终用户应用而不是用于军事目的。以下国家禁止进口 SHA:古巴、伊朗、伊拉克、利比亚、朝鲜、塞尔维亚、叙利亚和苏丹。请注意,此禁运国家名单会随时间而变化。

(不是对您问题的直接回答,但肯定是相关的。)

于 2010-01-06T16:20:38.363 回答
2

不是特别针对 iPhone,但库libs3提供了一个用于访问 Amazon 的 S3 服务的 C API。它或 FUSE s3fs组件可能是提取与亚马逊网络服务通信所需的例程的好来源。由于 Objective-C 的核心仍然是 C,因此这些例程在 iPhone 上应该可以正常工作。

我知道至少有一位开发人员在他们的 iPhone 应用程序中使用类似的东西来与 S3 存储桶进行通信。

于 2009-01-24T19:10:36.830 回答
2

我认为 CommonCrypto 库会做你想做的事。看看这个文件:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/include/CommonCrypto/CommonHMAC.h

于 2009-01-24T21:14:03.257 回答
0

我不知道现在是否是这种情况,但过去加密算法受到限制,您将它们分发到某些国家的权利受到限制。

如果情况仍然如此,则可能是 Apple 不希望/不能限制某些应用程序在这些国家/地区下载。

于 2009-01-24T18:51:18.257 回答