Есть ли библиотека для iPhone для работы с кодировкой HMAC-SHA-1
Для всех операций с услугами Amazon (S3, EC2, SimpleDB) Вам необходимо подписать все запросы с помощью HMAC-SHA-1 Signature (http://en.wikipedia.org/wiki/HMAC, http://docs.amazonwebservices.com/AWSFWS/latest/DeveloperGuide/index.html?SummaryOfAuthentication.html).
Я работаю под бэкэндом asp.net, и проблем нет. Проблема в приложении iPhone. Разработчик iPhone говорит, что нет возможности использовать кодировку HMAC-SHA-1, и у него нет никаких возможностей для реализации собственного алгоритма. Как программист, я не могу понять, почему может возникнуть проблема.
Так что я тоже хочу знать, правильно ли разработчик iPhone?
Я никогда не кодировал iPhone, поэтому я даже не знаю, где искать такую информацию.
Ответы
Ответ 1
CommonCrypto сделает это. Но если вы хотите код, у меня есть некоторые из них:
http://oauth.googlecode.com/svn/code/obj-c/OAuthConsumer/Crypto/
Что я написал для использования в реализации Cocoa OAuth: http://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer
Ответ 2
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];
Ответ 3
Эта статья демонстрирует небольшую функцию, которая будет генерировать хэш файл 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
Ответ 4
Немного googling, и я нашел этот документ.
Экспорт SHA1 подлежит (Соединенные Штаты Америки) Федеральное правительство экспортный контроль и экспортеры посоветовал обратиться в Департамент Торговля, Бюро экспорта Администрирование для получения дополнительной информации.
Я также нашел this:
Китайская Народная Республика и бывший советский блок может импортировать SHA как поскольку он предназначен для гражданских приложений для конечных пользователей, а не для военной цели. Следующие странам запрещено импорт SHA: Куба, Иран, Ирак, Ливия, Северная Корея, Сербия, Сирия и Судан. Обратите внимание, что этот список страны-эмбарго со временем меняются.
(Не прямой ответ на ваш вопрос, но, безусловно, улокальный.)
Ответ 5
Не для iPhone в частности, но библиотека libs3 предоставляет API C для доступа к сервисам Amazon S3. Он, или компонент FUSE s3fs, может быть хорошим источником для извлечения процедур, необходимых для взаимодействия с Amazon Web Services. Поскольку Objective-C по-прежнему C в своей основе, эти подпрограммы должны отлично работать на iPhone.
Я знаю, по крайней мере, одного разработчика, который использует что-то подобное в своем приложении iPhone для связи с ведрами S3.
Ответ 6
Я думаю, что библиотека CommonCrypto будет делать то, что вы хотите. Посмотрите на этот файл:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/include/CommonCrypto/CommonHMAC.h
Ответ 7
Я не знаю, так ли это, но раньше были ограничения на алгоритмы шифрования, и ваше право распространять их в определенные страны было ограничено.
Если это так, Apple может не хотеть/не может ограничить загрузку определенных приложений в этих странах.