Puede implementar SSL mutuamente autenticado entre sus clientes legítimos y su API. Genere un certificado de cliente SSL autofirmado y almacénelo dentro de su cliente. Configure su servidor para que requiera autenticación del lado del cliente y solo acepte los certificados que ha implementado para sus clientes. Si alguien/algo que intenta conectarse no tiene ese certificado de cliente, no podrá establecer una sesión SSL y la conexión no se realizará. Suponiendo que controle los clientes legítimos y los servidores, no necesita un certificado emitido por CA aquí; solo use certificados autofirmados ya que controla tanto la confianza del certificado del lado del cliente como la del lado del servidor.
Ahora, usted dice que es realmente difícil evitar que alguien realice ingeniería inversa en su cliente y recupere su credencial (la clave privada que pertenece al certificado del cliente, en este caso). Y tienes razón Normalmente almacenará esa clave (y el certificado) en un almacén de claves de algún tipo (un KeyStore
si está usando Android) y ese almacén de claves se cifrará. Esa encriptación se basa en una contraseña, por lo que deberá (1) almacenar esa contraseña en su cliente en alguna parte, o (2) pedirle al usuario la contraseña cuando inicie su aplicación cliente. Lo que debe hacer depende de su uso. Si (2) es aceptable, entonces ha protegido su credencial contra la ingeniería inversa, ya que será encriptada y la contraseña no se almacenará en ningún lugar (pero el usuario deberá ingresarla cada vez). Si lo hace (1), alguien podrá realizar una ingeniería inversa de su cliente, obtener la contraseña, obtener el almacén de claves, descifrar la clave privada y el certificado, y crear otro cliente que pueda conectarse al servidor.
No hay nada que pueda hacer para evitar esto; puede hacer que la ingeniería inversa sea más difícil para su código (por ofuscación, etc.) pero no puede hacerlo imposible.Debe determinar cuál es el riesgo que está tratando de mitigar con estos enfoques y cuánto trabajo vale la pena para mitigarlo.
El paso de OAuth es a través de SSL. Estoy tratando de proteger una API que será llamada por varios clientes diferentes que se ejecutan en una máquina de usuarios. El código de autenticación que obtengo del flujo de OAuth se pasa a todas las llamadas API en el encabezado Autorización de la solicitud. El código luego se verifica en el servidor. – Evan
Es OAuth2, tiene que ser a través de SSL. –