la mejor y más segura forma de almacenar las credenciales de la API de PayPal
Frecuentes
Visto 1,615 equipos
0
Estoy creando una aplicación para iPhone que integra la API de PayPal para iOS. La API requiere las credenciales de la API al enviar una solicitud. Leí la API de PayPal y dice
Nunca envíe solicitudes de Pago exprés desde su aplicación móvil directamente a PayPal. Las solicitudes requieren sus credenciales API de PayPal. Colocar sus credenciales en dispositivos móviles lo expone a usted y a PayPal a riesgos de seguridad inaceptables. Envíe solicitudes de Pago exprés solo desde servidores seguros.
Mi pregunta es, ¿cuál es la mejor manera de almacenar las credenciales de la API para disminuir las posibilidades de que mis credenciales sean expuestas o pirateadas? ¿Es arriesgado adjuntar las credenciales a una compilación de iPhone? ¿Por qué o cómo? ¿El almacenamiento de estas credenciales en un servidor seguro es lo suficientemente confiable?
EDITAR: ¿cómo puede el llavero acceder a la API en iOS para ayudarme con esto?
2 Respuestas
3
Poner las claves API en su aplicación es completamente inseguro. A través de una serie de técnicas, cualquier persona que pueda descargar la aplicación o tener en sus manos un teléfono con la aplicación puede simplemente leer la clave API. Esto se mantiene incluso si hace lo que sugirió @MatthiasBauch y descarga el secreto más tarde. También se mantiene incluso si hace lo que sugirió @Rexeisen y ofusca la cadena.
Lo mejor que puede hacer es usar los servicios de suscripción integrados de Apple para manejar los pagos (que pueden no ser aplicables y reciben una parte, pero es probable que sea más seguro que lo que puede hacer en el teléfono)
En el caso de que no quiera o no pueda hacer eso, asigne a cada instancia de la aplicación una identificación única que registren cuando se descarguen con un servidor que usted controle. Que sepa que tiene las credenciales de paypal y hará llamadas api en su nombre. De esta manera, si un teléfono determinado es robado o se le lee la clave API de su servidor, simplemente puede revocar esa clave y sus claves API de PayPal seguirán estando seguras. Advertencia importante: hasta que realmente revoques la clave de esa aplicación, cualquier persona que la tenga aún puede usarla para hacer lo que sea que admita tu servidor. Esto podría ser algo muy malo.
contestado el 22 de mayo de 12 a las 17:05
1
Es arriesgado ya que puede ejecutar la utilidad Strings en casi cualquier aplicación (pruébelo, da un poco de miedo) y obtener las cadenas del código. En general, recomendaría empaquetar los secretos en la aplicación, pero déjalos en un servidor seguro en otro lugar. Si debe ponerlo en la aplicación, una cosa que puede hacer es ofuscar las cadenas para que no sea obvio.
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);
Donde ofuscateOrDeobfuscateWithKey es una categoría en 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;
}
}
}
Entonces puedes declarar una constante para que sea algo como
static unsigned char const kTwitterClientSecret[] = {
0x00, 0x00, 0x00, ... etc ...
};
static unsigned int const kTwitterClientSecret_len = LENGTH;
Luego, para recuperar la cuerda, puedes hacer
[NSString deobfuscatedStringWithBytes:kTwitterClientSecret length:kTwitterClientSecret_len key:@"Twitter"];
Donde esta es una categoría en 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];
}
Esto hará una ofuscación muy simple y no aparecerá en cadenas.
Respondido 01 Jul 17, 17:07
ofuscar las cuerdas es una idea muy, muy mala. Es seguridad a través de la oscuridad solamente y cualquier persona con acceso al binario aún puede obtener los datos: miguelmiers
@imichaelmiers en ese caso, Apple y yo tendremos acceso a mi binario, ¿hay alguna forma de que otras personas que tengan mi aplicación lean su binario? en dispositivo con jailbreak o no. gracias por el comentario por cierto :) - Janusfidel
@janusfidel En un dispositivo con jailbreak, trivialmente, ya que el usuario puede ejecutar lo que quiera o simplemente volcar el sistema de archivos y montarlo en algo. En los dispositivos que no tienen jailbreak, sospecho que las mismas técnicas que se usan para tomar copias forenses de iPhones le darían los archivos binarios en ellos. A partir de ahí es, de nuevo, una simple cuestión de montar la imagen y leer/grep/cualquiera que sea el binario en cuestión. - miguelmiers
@imichaelmiers Entiendo lo que quieres decir :) gracias. ¿Qué pasa si uso el acceso de llavero? ¿Eso ayudaría? - Janusfidel
@janusfidel. Me refiero a que existen herramientas que, incluso en un teléfono sin jailbreak, pueden copiar el contenido de un iphone. Luego monta la copia en, por ejemplo, Linux y mira el binario (por ejemplo, con un editor hexadecimal). En cuanto al llavero, en realidad no. El llavero protege los datos del teléfono de otros que accedan a ellos, no al usuario de la aplicación. Conocen el PIN, por lo que pueden derivar las claves utilizadas para cifrar los datos. Recuerde, la amenaza aquí no es que se pierda el teléfono, sino que un sombrero negro instale la aplicación y lea las claves API. - miguelmiers
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ios security ssl paypal or haz tu propia pregunta.
la idea es crear su propio software de servidor que use esas credenciales. Nunca se revelan a nadie. No coloca las credenciales en un archivo de texto en su servidor y las descarga a su aplicación. La cita lo dice todo. - Matthias Bauch