2012-05-22 2 views
0

Я создаю приложение для iPhone, которое интегрирует API PayPal для iOS. API требует учетных данных API при отправке запроса. Я прочитал API PayPal, и он говорит:лучший и защищенный способ хранения PayPal api credentials

Никогда не отправляйте запросы Express Checkout из своего мобильного приложения непосредственно в PayPal. Запросы требуют ваших учетных данных PayPal API. Размещение ваших учетных данных на мобильных устройствах предоставляет вам и PayPal неприемлемые риски безопасности. Отправлять запросы Express Checkout только с защищенных серверов.

Вопрос в том, как лучше всего хранить учетные данные API, чтобы уменьшить возможности для моих учетных данных, которые подвергаются или взломаны? Является ли привязка учетных данных к iPhone рискованным? Почему и как? Является ли хранение этих учетных данных на безопасном сервере достаточно надежным?

EDIT: как может доступ к keychain api на iOS может помочь мне с этим?

+1

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

ответ

3

Ввод ключей API в ваше приложение полностью небезопасен. Благодаря проверке технологий любой, кто может загрузить приложение или получает доступ к телефону с помощью приложения, может просто прочитать ключ API. Это выполняется, даже если вы делаете то, что предложил @MatthiasBauch и загрузите секрет позже. Он также выполняется, даже если вы делаете то, что предлагал @Rexeisen, и обфускации строки.

Вы лучше всего пользователь яблока встроенных в подписных услугах для обработки платежей (которые не могут быть применимы, и они принимают надрез, но, вероятно, более безопасный, чем то, что вы можете сделать по телефону)

В вероятном даже если вы этого не хотите или не можете сделать, дайте каждому экземпляру приложения уникальный идентификатор, который они регистрируют при загрузке с сервера, которым вы управляете. Это разорвано, чем имеет учетные данные PayPal и будет делать звонки api от их имени. Таким образом, если какой-либо данный телефон украден/имеет свой ключ api для вашего сервера, вы можете просто отменить этот ключ, а ваши ключи API PayPal по-прежнему безопасны. Важное предостережение: пока вы фактически не отмените ключ этого приложения, любой, у кого есть он, все еще может использовать его, чтобы сделать так, как когда-либо назовешь ваш сервер. Это может быть очень плохо.

+0

Отличная информация! большое спасибо – janusbalatbat

1

Это опасно, поскольку вы можете запустить утилиту Strings практически для любого приложения (попробуйте, это немного страшно) и получите строки из кода. Обычно я рекомендую упаковать секреты в приложении, но оставим их на безопасном сервере в другом месте. Если вы должны поместить его в приложение, одно можно сделать, это обфускать строки, чтобы это не было очевидно.

NSString *secret = kTwitterClientSecret; 
NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *key = @"Twitter"; 
[secretData obfuscateOrDeobfuscateWithKey:key]; 
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
NSString *path = [NSString stringWithFormat:@"%@/%@-%@", documentsPath, key, @"output"]; 
[secretData writeToFile:path atomically:NO]; 
NSLog(@"Wrote obfuscated data to: %@", documentsPath); 

Где obfuscateOrDeobfuscateWithKey категория на NSData

// Inspiration from: http://iosdevelopertips.com/cocoa/obfuscation-encryption-of-string-nsstring.html 
- (void)obfuscateOrDeobfuscateWithKey:(NSString *)key 
{ 
    // Get pointer to data to obfuscate 
    char *dataPtr = (char *) [self bytes]; 

    // Get pointer to key data 
    char *keyData = (char *) [[key dataUsingEncoding:NSUTF8StringEncoding] bytes]; 

    // Points to each char in sequence in the key 
    char *keyPtr = keyData; 
    int keyIndex = 0; 

    // For each character in data, xor with current value in key 
    for (int x = 0; x < [self length]; x++) { 
     // Replace current character in data with current character xor'd with current key value. 
     // Bump each pointer to the next character. 
     *dataPtr = *dataPtr^*keyPtr; 
     dataPtr++; 
     keyPtr++; 

     // If at end of key data, reset count and set key pointer back to start of key value 
     if (++keyIndex == [key length]) { 
      keyIndex = 0, keyPtr = keyData; 
     } 
    } 
} 

Тогда вы можете объявить константу, чтобы быть чем-то вроде

static unsigned char const kTwitterClientSecret[] = { 
    0x00, 0x00, 0x00, ... etc ... 
}; 
static unsigned int const kTwitterClientSecret_len = LENGTH; 

Затем, чтобы получить строку обратно вы можете сделать

[NSString deobfuscatedStringWithBytes:kTwitterClientSecret length:kTwitterClientSecret_len key:@"Twitter"]; 

Где это категория на NSString

+ (NSString *)deobfuscatedStringWithBytes:(const void *)bytes length:(NSUInteger)length key:(NSString *)key 
{ 
    NSData *deobfuscatedData = [NSData dataWithBytes:bytes length:length]; 
    [deobfuscatedData obfuscateOrDeobfuscateWithKey:key]; 
    return [[NSString alloc] initWithData:deobfuscatedData encoding:NSUTF8StringEncoding]; 
} 

Это будет делать очень простой запутывания и не будет отображаться в строках.

+0

обфускание струн - действительно очень плохая идея. Его безопасность только через неизвестность и все, у кого есть доступ к двоичному файлу, могут получить данные – imichaelmiers

+0

@imichaelmiers, в этом случае у меня и яблока будет доступ к моему двоичному файлу, есть ли способ, которым другие люди, у которых есть приложение, читают его двоичным? в джейлбрейк-устройстве или нет. спасибо за комментарий btw :) – janusbalatbat

+0

@janusfidel На устройстве, разбитом на тюремное устройство, тривиально, так как пользователь может выполнить то, что когда-либо захочет, или просто сбрасывать файловую систему и монтировать ее на что-то. На неуключенных устройствах, подозреваемых в том, что те же методы, которые используются для получения судебных копий iphones, предоставят вам двоичные файлы. Оттуда, опять же, простой вопрос - установить образ и прочитать/grep/независимо от того, что представляет собой двоичный файл. – imichaelmiers

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