2009-01-24 25 views
14

Dla wszystkich operacji z usługami Amazon (S3, EC2, SimpleDB) Musisz podpisać wszystkie potwierdzenia za pomocą podpisu HMAC-SHA-1 (http://en.wikipedia.org/wiki/HMAC, http://docs.amazonwebservices.com/AWSFWS/latest/DeveloperGuide/index.html?SummaryOfAuthentication.html).Czy istnieje biblioteka dla iPhone'a do pracy z kodowaniem HMAC-SHA-1?

Pracuję pod wsparciem dla asp.net i nie ma żadnych problemów. Problem dotyczy aplikacji na iPhone'a. Twórca iPhone'a twierdzi, że nie ma sposobu na użycie kodowania HMAC-SHA-1 i nie ma on żadnych praw do implementacji własnego algorytmu. Jako programista nie rozumiem, dlaczego może być problem.

Więc chcę wiedzieć, czy programista iPhone ma rację?

Nigdy nie kodowałem dla iPhone'a, więc nie mam nawet gdzie szukać takich informacji.

+1

Zasadniczo Twój programista iPhone'a jest nieprawidłowy ... – schwa

Odpowiedz

0

Nie wiem, czy tak jest, ale kiedyś obowiązywały ograniczenia algorytmów szyfrowania, a prawo do ich dystrybucji w niektórych krajach było ograniczone.

Jeśli tak się dzieje, może to oznaczać, że Apple nie chce/nie może ograniczyć pobierania niektórych aplikacji w tych krajach.

2

Nie w szczególności dla iPhone'a, ale biblioteka libs3 zapewnia C API do uzyskiwania dostępu do usług S3 Amazon. To, lub komponent FUSE s3fs, może być dobrym źródłem do wydobywania rutyn potrzebnych do komunikowania się z usługami sieciowymi Amazon. Ponieważ Objective-C jest nadal w centrum rdzenia, te procedury powinny działać poprawnie na iPhone'ie.

Znam przynajmniej jednego programistę, który używa czegoś podobnego w swojej aplikacji na iPhone'a do komunikacji z wiaderkami S3.

+0

Cześć! Czy pracowałeś z libs3? – Hate

2

Myślę, że biblioteka CommonCrypto zrobi to, co chcesz. Spójrz na tego pliku:

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

14

CommonCrypto załatwia sprawę.

#import <CommonCrypto/CommonHMAC.h> 

potem

/* 
    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

Może to być proste pytanie ... Aby przekonwertować *, użyłbyś czegoś takiego jak [[NSString alloc] initWithData: out encoding: NSUTF8StringEncoding] ;? –

+1

właśnie tak. można zobaczyć http://github.com/soundcloud/cocoa-api-wrapper/blob/b9e73f9cba5eec1dec9ac650d7059cc9ce23c76d/SoundCloudAPI/Outsourced/OAuthConsumer/OAHMAC_SHA1SignatureProvider.m na prawdziwy przykład życia. – stigi

4

Nieco googling i okazało this document.

wywozu SHA1 podlega (Stany Statese) rząd federalny kontroli eksportowych i eksporterzy zaleca się kontakt z Działem Handlu, Biuro Administracji Eksportu, aby uzyskać więcej informacji.

Znalazłem również this:

Republika Ludowa i byłego bloku sowieckiego mogą importować SHA jako długo, jak to jest przeznaczone dla cywilnych aplikacji użytkownika końcowego, a nie dla celów wojskowych. Następujące kraje: są zabronione od importowania SHA: Kuba, Iran, Irak, Libia, Korea Północna, Serbia, Syria i Sudan. Należy pamiętać, że lista krajów objętych embargiem zmienia się z czasem.

(Nie jest to bezpośrednia odpowiedź na Twoje pytanie, ale na pewno trafny.)

5

Ten article wykazuje niewielką funkcję, która wygeneruje SHA-1 hash digest, który będzie zgodny z zasadami stosowanymi SHA1() w PHP funkcja wygeneruje, jeśli podasz to samo wejście:

#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 to nie to samo co HMAC-SHA-1. –

+0

Niejawna konwersja traci dokładność całkowitą (NSUInteger do CC_LONG) – Jonny