2012-05-22 65 views
0

我正在創建一個iPhone應用程序,它集成了iOS的PayPal API。發送請求時,API需要API憑據。我讀了PayPal API,它說最好和安全的方式存儲PayPal API憑證

絕不會從您的移動應用程序直接向PayPal發送快速結帳請求。這些請求需要您的PayPal API憑據。將您的憑證放置在移動設備上會讓您和PayPal面臨不可接受的安全風險。僅從安全服務器發送快速結帳請求。

我的問題是,什麼是存儲API憑據的最佳方式,以減少我的憑據被暴露或黑客的可能性?是否將憑證附加到iPhone構建風險?爲什麼或如何?將這些證書存儲在安全的服務器上足夠可靠嗎?

編輯:鑰匙串如何在iOS上訪問API可以幫助我呢?

+1

這個想法是創建您自己的服務器軟件,使用這些憑據。他們從來沒有透露給任何人。您不要將憑據放在服務器上的文本文件中,然後將它們下載到您的應用程序中。報價說明了這一切。 –

回答

3

將API密鑰放入您的應用程序中是完全不安全的。通過各種技術,任何人都可以下載應用程序或通過手機上的應用程序獲取他們的手,只需讀取API密鑰即可。即使你做了@MatthiasBauch建議的並且稍後下載祕密,這也是成立的。即使您執行了@Rexeisen建議的操作並混淆了字符串,它也是成立的。

您最好的選擇是建立在訂閱服務來處理支付用戶蘋果公司(可能不適用,他們採取了切斷,但很可能比你可以在手機上做的更安全)

在有可能即使你不想或不能這樣做,給每個應用程序的實例一個唯一的ID,他們註冊時,他們與您控制的服務器下載。該服務器比PayPal憑證嚴重,並且將代表他們進行api調用。這樣,如果任何給定的手機被盜/有其API密鑰到您的服務器讀取,您可以簡單地撤銷該密鑰,並且您的PayPal API密鑰仍然安全。重要提醒:除非您真的撤消了該應用的密鑰,否則任何擁有此密鑰的人都可以使用它來創建您的服務器支持的服務。這可能是一件非常糟糕的事情。

+0

重大信息!非常感謝 – janusbalatbat

1

由於您可以在幾乎任何應用程序上運行字符串實用程序(嘗試它,它有點嚇人)並從代碼中獲取字符串,這是有風險的。一般來說,我建議將這些祕密包裝在應用程序中,但將其留在其他地方的安全服務器上。如果你必須把它放在應用程序中,你可以做的一件事是混淆字符串,所以它不明顯。

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