2009-04-09 2 views
6

im пытается получить звонок на веб-службу amazon и им застрял на получении подписи, посмотрел на это, но у меня все еще есть вопрос.iPhone и HMAC-SHA-1 кодировка

используя этот пример, что является

NSData *keyData; 
NSData *clearTextData 

? что мне нужно передать для этих двух значений?

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

ответ

5

Если вы звоните веб-сервис Amazon тоже посмотреть цены или детали продукта, будут отключены ключ веб-сервис Amazon и приложение перестанет работать ,

Посмотрите на сроки службы веб-служб Amazon, использование мобильных клиентов строго запрещено:

https://affiliate-program.amazon.com/gp/advertising/api/detail/agreement.html

Я нашел это трудный путь, когда мое приложение было моим основным AWS отключена производственное приложение. Я прочитал TOS, но на самом деле это было не так, как вы можете видеть по ссылке выше, с некоторыми другими неясными деталями использования. Вы не думаете, что партнерская программа будет иметь какое-либо отношение к API, но это так.

Вы можете найти подробную информацию о других программах блокированных в этой статье TechCrunch:

http://www.techcrunch.com/2009/07/07/amazon-killing-mobile-apps-that-use-its-data/

Просто давая вам головы и, надеюсь, вы экономите много работы.

+0

Где говорится: «Использование мобильными клиентами строго запрещено» http://aws.amazon.com/agreement/? – jeff7091

+0

Я знаю, из опыта использования AWS и с Amazon отменить мой ключ из производственного приложения. Мне удалось найти статью один раз, но я не могу найти ее снова - досадно, что это было не в AWS TOS, с которой вы связались (я прочитал это до того, как начал развиваться) –

+0

Я добавил ссылки с более подробными доказательствами моей точки , Кто-нибудь хочет удалить нижестоящий голос, поскольку я на самом деле полезен и не вводя в заблуждение? –

0

Я разместил одно решение для этого here, которое возвращает кодированные данные Base64, которые запрашивает AWS.

33

Я просто потратил 4 часа на поиск Google и нашел способы рассчитать неизолированный SHA1 на iPhone, который бы соответствовал результатам функции sha1() в php. Здесь был результат:

#import <CommonCrypto/CommonDigest.h> 

    NSString *hashkey = <your data here>; 
// PHP uses ASCII encoding, not UTF 
const char *s = [hashkey cStringUsingEncoding:NSASCIIStringEncoding]; 
NSData *keyData = [NSData dataWithBytes:s length:strlen(s)]; 

// This is the destination 
uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0}; 
// This one function does an unkeyed SHA1 hash of your hash data 
CC_SHA1(keyData.bytes, keyData.length, digest); 

// Now convert to NSData structure to make it usable again 
NSData *out = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 
// description converts to hex but puts <> around it and spaces every 4 bytes 
NSString *hash = [out description]; 
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""]; 
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""]; 
// hash is now a string with just the 40char hash value in it 

Надеюсь, это поможет другим, которые борются с SHA1 на iPhone

+0

Это очень помогло мне. Благодаря! Я тоже отправил свой код! – Eonil

+0

великолепная работа !!!! –

+0

это так здорово!мне потребовалось всего 30 минут на час или около того, чтобы найти это (в отличие от 4), поэтому спасибо тонну !! :) – taber

2
// This is my code used in my Twitter connection, and working well for me. 
// KeithF's code was a big help! 
// 
// This is a category added to NSData. 

@implementation NSData (EOUtil) 
- (NSData*)dataByHmacSHA1EncryptingWithKey:(NSData*)key 
{ 
    void* buffer = malloc(CC_SHA1_DIGEST_LENGTH); 
    CCHmac(kCCHmacAlgSHA1, [key bytes], [key length], [self bytes], [self length], buffer); 
    return [NSData dataWithBytesNoCopy:buffer length:CC_SHA1_DIGEST_LENGTH freeWhenDone:YES]; 
} 
@end 
+0

Я реализовал ваш метод. Вместо этого я использовал SHA512. Теперь мой вопрос заключается в том, как отправить хеш-аутентификацию на сервер. Я инициализировал NSString данными хэша. Но он состоит из множества перевернутых вопросительных знаков, что я не верю, что это будет хорошо. Могу ли я отправить необработанные данные? –

+0

@ Зашифрованные данные из Юлиана по умолчанию двоичные. Вы должны иметь возможность отправлять двоичные данные. Это означает, что ваш протокол связи должен поддерживать передачу двоичных данных. Если он поддерживает только текстовые данные (например, простые HTTP-заголовки), вам необходимо * закодировать * двоичные данные в строку. Тривиальный выбор - это «BASE64» или кодировка с шестнадцатеричным кодом, которая хорошо определена и широко используется. – Eonil

+0

Некоторые языки не имеют возможности обрабатывать двоичные данные, обычно возвращает Любая реализация, которая возвращает строку вместо двоичного, фактически выполняет эту кодировку перед возвратом. В любом случае они обычно определяют, как они кодируют его, поэтому обратитесь к спецификации языка для конкретного метода кодирования. – Eonil

0

библиотека для разработчиков IOS от Apple предоставила отличный образец под названием CryptoExercise который включает в себя простую функцию :

- (NSData *)getHashBytes:(NSData *)plainText" to get a SHA-1 hash. 
-1

Вы можете увидеть this может быть, это поможет с вами.

+0

Вместо того, чтобы просто предоставить ссылку, [было бы желательно] (http://meta.stackexchange.com/a/8259) включить основные части ответа здесь, и просто укажите ссылку для дополнительной ссылки. Если вы не справитесь с этой задачей, вы должны просто рассмотреть [оставить комментарий] (http://stackoverflow.com/privileges/comment) в вопросе, а не публиковать ответ. – Dukeling

Смежные вопросы