2009-01-24 35 views
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)對所有請求進行簽名。是否有適合iPhone使用HMAC-SHA-1編碼的庫

我在asp.net後端工作,沒有問題。問題出在iPhone應用程序中。 iPhone開發人員說,沒有辦法使用HMAC-SHA-1編碼,他沒有實現他自己的算法的實踐。作爲程序員,我不明白爲什麼會出現問題。

那麼我也想知道iPhone開發者是對嗎?

我從來沒有爲iPhone編碼,所以我甚至不在哪裏搜索這樣的信息。

+1

所以基本上你的iPhone開發者是錯的... – schwa 2009-01-24 23:10:06

回答

0

我不知道這是否是這種情況,但過去有加密算法的限制,並且您將它們分發給某些國家的權利受到限制。

如果仍然如此,可能是Apple不希望/不能限制某些應用程序在這些國家/地區下載。

2

不適用於iPhone,但圖書館libs3提供了用於訪問亞馬遜S3服務的C API。它或FUSE s3fs組件可能是提取與亞馬遜Web服務進行通信所需的例程的良好來源。由於Objective-C仍然是C的核心,這些例程在iPhone上應該可以正常工作。

我知道至少有一位開發人員在iPhone應用程序中使用類似的東西來與S3存儲桶進行通信。

+0

嗨!你有沒有使用libs3? – Hate 2011-11-01 16:57:32

2

我想CommonCrypto庫會做你想做的。看看這個文件:

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

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] ;? – 2009-06-10 04:57:42

+1

就是這樣。 你可以看到一個真實的例子http://github.com/soundcloud/cocoa-api-wrapper/blob/b9e73f9cba5eec1dec9ac650d7059cc9ce23c76d/SoundCloudAPI/Outsourced/OAuthConsumer/OAHMAC_SHA1SignatureProvider.m。 – stigi 2009-06-11 15:36:12

4

和我的googling有點找到this document

SHA1的出口受到 (美國Statese)聯邦政府 出口管制,並建議 出口商聯繫 商務部,出口 管理局局部以獲取更多信息。

我還發現this

中國人民共和國和 前蘇聯座可以導入SHA作爲 只要它是用於民用 最終用戶應用程序,而不是 軍事目的。以下 國家被禁止從 進口SHA:古巴,伊朗,伊拉克, 利比亞,朝鮮,塞爾維亞,敘利亞和 蘇丹。請注意,禁運國家名單 隨時間推移而變化。

(不是直接回答你的問題,但肯定有關。)

5

article演示了一個小功能,將產生的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 
相關問題