2009-09-09 24 views
7

Estoy desarrollando una aplicación que se conecta a una API basada en XML. Tengo control sobre el servidor y la aplicación. ¿Hay alguna manera de asegurarme de que solo mi aplicación pueda acceder a la API?Comunicación segura entre iPhone y servidor?

No hay autenticación de usuario.

EDIT:

La principal preocupación es que los robots de robar datos escaneando el código XML.

¿Qué tal esto:

solicito una sesión con el UDID del dispositivo y que dan una llave apretón de manos.

<handshake>23354</handshake> 

de esta cadena una contraseña se calcula tanto en el servidor y el cliente de acuerdo a un algoritmo acordado (que sólo tiene que ser difícil de reconstruir)

Digamos por ahora que agrego 1 a la apretón de manos clave

password = 23354 

En todas las llamadas a la API, a continuación, paso esta contraseña junto con el UDID. Esto permitiría al servidor limitar cada sesión a un cierto número de llamadas, ¿no?

¿Qué opinas?

Respuesta

2

Puede proporcionar un mecanismo de respuesta rápida, asumiendo que tiene control sobre la API XML.

Genere un número e inclúyalo en su aplicación y en el lado del servidor. Úselo como una semilla para srand() tanto en el cliente como en el servidor.

Tener la petición del cliente incluir algo como:

<handshake id="123">12312931</handshake> 

allí Identificación significa la 123'rd genera números aleatorios y 12312931 es el valor después de llamar a rand() 123 veces. El valor 123 debe ser un número generado aleatoriamente (¡generado con una semilla diferente!) También.

Esto no es una respuesta a prueba de tontos, pero es simple y eficiente, y no depende de nada más que un conjunto básico de bibliotecas ANSI C.

Tenga en cuenta que tampoco es terriblemente seguro: todo lo que tendría que hacer es hacer que su cliente desafíe a su propio servidor, luego genere el número aleatorio (en este ejemplo) 123'rd para cada valor inicial hasta que lo encuentren. Así que no usaría esto esperando que proporcionara autenticación de nivel criptográfico o control de acceso. Simplemente proporciona una respuesta de desafío simple y no trivial que es eficiente y fácil de implementar.

+0

No creo que haya ninguna promesa de que la secuencia devuelta por rand() sea la misma de una plataforma a otra. POSIX no parece definir el algoritmo real, solo los requisitos mínimos. Supongo que en el de arriba el servidor elige "123". Si el cliente lo elige, entonces no proporciona seguridad (ni siquiera seguridad trivial). Si el servidor envía la identificación, hay descansos más rápidos que el cálculo de todos los valores de 64k semillas. Lo más obvio es mirar la sesión. También puedo encontrar la semilla mucho más rápido desafiando al cliente con id = 1, luego id = 2 para las pocas colisiones. –

0

Acceda a su servicio web a través de https con autenticación.

+0

Sí, pero ¿cómo? Intentando resolver eso en el iPhone. ¿Qué clases estás usando para esto? – Spanky

3

No, no es posible asegurarse de que solo su aplicación pueda contactar a su servidor. Hay técnicas de ofuscación para elevar el nivel de los atacantes, y eso funcionará para la mayoría de los atacantes. Su problema subyacente no se puede resolver para un atacante dedicado. Puede encontrar una lista de otras publicaciones sobre este tema en iPhone: How to encrypt a string. Hay varias técnicas que puede usar en esas publicaciones, y algunas discusiones sobre cómo y si debe atacar los problemas subyacentes.

1

Puede usar algún tipo de firma para verificar que efectivamente es su aplicación la que hace la llamada, calcula la firma tanto del lado del servidor como de la aplicación, solo si coinciden regresará el servicio con una respuesta a la solicitud . Típicamente, las firmas se componen de algún tipo de parámetros de su función seguidos de una clave secreta, luego toman el hash md5 de eso y lo procesan. En la búsqueda, nadie podrá encontrar la clave secreta porque está en el hash md5.

+0

Desafortunadamente, la clave secreta debe codificarse en su programa, que luego deberá entregar a los usuarios. Un atacante realizará una ingeniería inversa de la clave secreta del ejecutable (o de la memoria en un depurador) y luego la usará para conectarse al servidor. O modificará su programa para hacer lo que desee, y dejará que su programa maneje el apretón de manos secreto para él. Esta es una forma de ofuscación, pero no resolverá el problema si tienes algún tipo de atacante dedicado. –

-2

Creo que la verdadera pregunta que debes hacerte es ¿cuánto riesgo corren tus datos de ataque? Diría que el 99% del tiempo te irá bien con solo una URL ofuscada que será difícil de adivinar, ya que las posibilidades de que el usuario promedio intente hacer algo con ellas fuera de tu aplicación son escasas. Si le preocupa que sus competidores le roben, sugiero algo un poco más infame:

En su aplicación, configúrelo para que su aplicación y servidor cambien las URL de vez en cuando, tal vez cada dos semanas. Entonces, si alguien intenta acceder a su XML API, luchará constantemente para descubrir sus URL. Y como guinda del pastel, mantenga activas las URL antiguas pero haga que devuelvan datos incorrectos. Creo que puedes dejar volar tu imaginación y descubrir el resto desde aquí.

+0

¿Cómo determina la aplicación cuál será la URL correcta? Cualquier técnica que utilice puede ser duplicada por cualquier persona que aplique ingeniería inversa a la aplicación. Del mismo modo, simplemente olfatear el tráfico de la aplicación legítima le dirá a la aplicación deshonesta dónde conectarse. Esta solución es complicada de implementar sin afectar a los usuarios legítimos (que pueden tener problemas durante cada transición), pero es solo otra versión de un secreto compartido, excepto que este secreto ni siquiera está encriptado en el cable (ya que la URL no puede ser) . –

+0

Esta no es una respuesta útil ya que no responde su pregunta en absoluto. Además, no proporciona ningún mecanismo real para hacer lo que sugiere. – Ryan

Cuestiones relacionadas