No hay una manera absoluta de lograr este objetivo. Si tiene un servicio web que usa una credencial compartida (una incluida en la aplicación), entonces será posible realizar una ingeniería inversa de esa credencial. En última instancia, es imposible garantizar que un cliente que se ejecuta en otra máquina sea "su" cliente.
Ha habido muchas discusiones sobre esto. No es imposible, solo imposible de resolver al 100% (o incluso al 90%). Un simple secreto compartido sobre SSL detendrá a la mayoría de sus atacantes sin dañar a sus usuarios o costando mucho para desarrollarse. Es ofuscación, no seguridad, pero es barata y "en su mayor parte efectiva" es mucho mejor que costosa y "en su mayoría efectiva".
Si tiene un producto de muy alto valor, entonces puede garantizar soluciones más agresivas (costosas). Todas estas soluciones incluyen una de dos cosas:
- Autenticación del usuario en lugar del programa, o
- una vigilancia continua, en busca de nuevos ataques y responder con correcciones que taparlos.
Este último es muy caro y nunca termina. Asegúrate de que valga la pena.
Algunas otras discusiones útiles:
EDITAR Quería señalar una cosa sobre mi mención de "secreto compartido sobre SSL". Recuerde que si no verifica el certificado, está sujeto a ataques de hombre en el medio muy fáciles. Los proxies fácilmente disponibles como Charles pueden hacer esto. El mejor enfoque es asegurarse de que el certificado SSL que se devuelve esté firmado por su certificado raíz, no solo como "cualquier certificado confiable". Puede reconfigurar en qué certificados confía su aplicación con SecTrustSetAnchorCertificates()
. iOS5:PTL cubre esta técnica en el Capítulo 11 (página 221). También envolví esto en una biblioteca llamada RNPinnedCertValidator.
Otra buena capa es implementar un sistema de desafío-respuesta donde el servidor autentica que el cliente tiene el secreto compartido sin tener que ponerlo en el cable. El artículo de Wikipedia en Challenge-resonse authentication incluye una buena explicación del algoritmo.
Realmente debería aceptar la respuesta a continuación. Es muy bueno. –