кодирование iPhone и HMAC-SHA-1 - PullRequest
6 голосов
/ 09 апреля 2009

Я пытаюсь позвонить в веб-сервис Amazon и застрял при получении подписи, посмотрел на это, но у меня все еще есть вопрос

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

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]

Ответы [ 7 ]

33 голосов
/ 05 июля 2009

Я потратил около 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

5 голосов
/ 10 апреля 2009

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

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

https://affiliate -program.amazon.com / зм / реклама / API / подробно / agreement.html

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

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

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

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

2 голосов
/ 06 мая 2010
// 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 голосов
/ 11 марта 2014

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

0 голосов
/ 02 мая 2012

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

- (NSData *)getHashBytes:(NSData *)plainText" to get a SHA-1 hash.
0 голосов
/ 04 июня 2009

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

0 голосов
/ 10 апреля 2009

Посмотрите на CocoaCryptoHashing для кодировки SHA1

...