最好和安全的方式存储PayPal API凭证
我正在创建一个iPhone应用程序,它集成了iOS的PayPal API。发送请求时,API需要API凭据。我读了PayPal API,它说最好和安全的方式存储PayPal API凭证
绝不会从您的移动应用程序直接向PayPal发送快速结帐请求。这些请求需要您的PayPal API凭据。将您的凭证放置在移动设备上会让您和PayPal面临不可接受的安全风险。仅从安全服务器发送快速结帐请求。
我的问题是,什么是存储API凭据的最佳方式,以减少我的凭据被暴露或黑客的可能性?是否将凭证附加到iPhone构建风险?为什么或如何?将这些证书存储在安全的服务器上足够可靠吗?
编辑:钥匙串如何在iOS上访问API可以帮助我呢?
将API密钥放入您的应用程序中是完全不安全的。通过各种技术,任何人都可以下载应用程序或通过手机上的应用程序获取他们的手,只需读取API密钥即可。即使你做了@MatthiasBauch建议的并且稍后下载秘密,这也是成立的。即使您执行了@Rexeisen建议的操作并混淆了字符串,它也是成立的。
您最好的选择是建立在订阅服务来处理支付用户苹果公司(可能不适用,他们采取了切断,但很可能比你可以在手机上做的更安全)
在有可能即使你不想或不能这样做,给每个应用程序的实例一个唯一的ID,他们注册时,他们与您控制的服务器下载。该服务器比PayPal凭证严重,并且将代表他们进行api调用。这样,如果任何给定的手机被盗/有其API密钥到您的服务器读取,您可以简单地撤销该密钥,并且您的PayPal API密钥仍然安全。重要提醒:除非您真的撤消了该应用的密钥,否则任何拥有此密钥的人都可以使用它来创建您的服务器支持的服务。这可能是一件非常糟糕的事情。
重大信息!非常感谢 – janusbalatbat
由于您可以在几乎任何应用程序上运行字符串实用程序(尝试它,它有点吓人)并从代码中获取字符串,这是有风险的。一般来说,我建议将这些秘密包装在应用程序中,但将其留在其他地方的安全服务器上。如果你必须把它放在应用程序中,你可以做的一件事是混淆字符串,所以它不明显。
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];
}
这将非常简单的事情混淆和字符串不会出现一个类别。
混淆字符串是一个非常糟糕的主意。它的安全性只能通过默默无闻,任何有权访问二进制文件的人仍然可以在这种情况下获得数据 – imichaelmiers
@imichaelmiers,苹果和我将有权访问我的二进制文件,有没有其他人拥有我的应用程序读取二进制文件?在越狱设备中或没有。感谢您的评论btw :) – janusbalatbat
@janusfidel在一个监狱破碎的设备,平凡,因为用户可以执行他们想要的任何东西,或者只是转储文件系统并将其挂载到某个东西上。 在非监狱破碎的设备上,我怀疑用于取得iphones的法庭副本的相同技术会给你他们的二进制文件。从那里,再次,挂载图像和读取/ grep /无论二进制文件是一个简单的问题。 – imichaelmiers
这个想法是创建您自己的服务器软件,使用这些凭据。他们从来没有透露给任何人。您不要将凭据放在服务器上的文本文件中,然后将它们下载到您的应用程序中。报价说明了这一切。 –