iPhone是否有用于HMAC-SHA-1编码的库?

14

对于所有与亚马逊服务(S3,EC2,SimpleDB)有关的操作,您需要使用HMAC-SHA-1签名(http://en.wikipedia.org/wiki/HMAChttp://docs.amazonwebservices.com/AWSFWS/latest/DeveloperGuide/index.html?SummaryOfAuthentication.html)签署所有请求。

我正在使用asp.net后端工作,并没有问题。问题出在iPhone应用程序上。 iPhone开发人员表示无法使用HMAC-SHA-1编码,也没有权利实现自己的算法。作为程序员,我无法理解为什么会出现这样的问题。

所以我想知道iPhone开发人员是否正确?

我从未为iPhone编写过代码,因此我甚至不知道在哪里搜索此类信息。


1
所以基本上你的iPhone开发者是错的... - schwa
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];

1
这可能是一个简单的问题... 要转换 *out,您会使用类似于 [[NSString alloc] initWithData:out encoding:NSUTF8StringEncoding]; 的东西吗? - Larry Hipp
1
您可以查看http://github.com/soundcloud/cocoa-api-wrapper/blob/b9e73f9cba5eec1dec9ac650d7059cc9ce23c76d/SoundCloudAPI/Outsourced/OAuthConsumer/OAHMAC_SHA1SignatureProvider.m以获取一个真实的例子。 - stigi

6

1
但请记住,这会向您的应用程序添加加密代码,并可能在批准过程中导致问题。 - stigi

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

1
SHA-1和HMAC-SHA-1不是同一件事。 - Steve Madsen
隐式转换丢失整数精度(NSUInteger 到 CC_LONG) - Jonny

4
通过一些谷歌搜索,我找到了这份文件

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

我还找到了这个

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

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


2

这不是专门为iPhone而设计的,但是库libs3提供了一个C API,用于访问Amazon的S3服务。 它或者FUSE s3fs组件,可能是提取与Amazon Web Services通信所需程序例程的好资源。 因为Objective-C本质上仍然是C语言,所以这些程序例程在iPhone上应该能够正常工作。

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


2
我认为CommonCrypto库可以满足您的需求。请查看以下文件:

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


0

我不确定现在是否仍然存在这种情况,但以前加密算法存在限制,你的分发权受到某些国家的限制。

如果现在仍然是这种情况,那么苹果可能不希望/不能限制某些应用程序在这些国家被下载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接