php - por - json web token español
La mejor manera de asegurar la API REST privada sin autenticación de usuario para la aplicación móvil (4)
De hecho, puede hacer el trabajo más difícil para los ingenieros inversos, pero no puede hacerlo a prueba de balas, como dijo Nasir , al presentar problemas matemáticos difíciles y transformar su cadena codificada en consecuencia.
Qué tal esto. Supongamos un número A
codificado en la aplicación. El servidor envía dos números B
y P
(P es un número primo grande). Ahora puede calcular el número real que será validado por el servidor usando (A^B) % P
Su aplicación ahora cifra la respuesta de (A^B)%P
con Server''s Public Key
. El servidor lo descifrará con su clave privada, lo validará y emitirá un token (quizás jwt) con un tiempo de caducidad. Entonces su aplicación y servidor pueden comunicarse usando ese token. Puede realizar los cálculos una vez cuando la aplicación se inicia y almacenar el token para su uso posterior.
Estoy haciendo algunas APIs Restful para mi aplicación móvil.
La comunicación entre la aplicación y el servidor web debe realizarse en REST. Estas apis deben ser privadas, y solo mi aplicación debe poder llamarlas para obtener resultados exitosos.
La parte difícil es que no se requieren identificación de usuario ni contraseña en mi aplicación, así que no sé cómo podría restringir el API de descanso con la aplicación móvil sin la autenticación básica del usuario.
Una solución que pensé fue incrustar algún tipo de cadena de código de disco duro para que cuando la aplicación móvil use la url tranquila, la pasen en formato de cifrado a través de ssl. Pero sé que esto parece ser una muy mala solución ...
sugiera amablemente cuál debe ser la mejor solución en tal situación.
Eche un vistazo al mecanismo del código de autenticación de mensajes basado en Hash (HMAC).
Enlace de Wikipedia: http://en.wikipedia.org/wiki/Hash-based_message_authentication_code
Su cliente (aplicación móvil) necesitará una clave de API pública que identifique al cliente de servicio web REST y una clave privada / criptográfica . La clave de API pública se puede enviar junto con la solicitud HTTP. Es público y todos pueden verlo. Sin embargo, la clave privada nunca debe enviarse junto con la solicitud, y solo debe ser conocida por el servidor y el cliente. Esta clave se utiliza para generar el mensaje de hash que, en cambio, se enviará al servidor. El HMAC puede generarse utilizando un algoritmo SHA1 / MD5, un mensaje que debe ser generado por un algoritmo que el servidor y el cliente conozcan y, finalmente, la clave privada.
Usted tiene razón, la clave incrustada en la aplicación se puede recuperar fácilmente con los rastreadores de paquetes u otras técnicas. Puedes superar este problema usando las siguientes instrucciones.
- cliente (su aplicación) llamará a la API requerida
- el servidor lo rechazará, pero en respuesta enviará una cadena que contiene hash aleatorio (= desafío ).
- el cliente usa esa cadena en combinación con alguna otra cadena (= contraseña ) (ya integrada en la aplicación) para generar un nuevo hash (= resumen )
- el cliente volverá a llamar a la misma API pero esta vez utilizando un compendio recién creado como parámetros de autenticación.
- servidor validará ese resumen y procederá
Para su información: el procedimiento mencionado anteriormente es un estándar ampliamente aceptado y se conoce como Autenticación Digest . Si necesita más ayuda, solo pregunte a Google por la "autenticación del resumen de http android"
Yo sugeriría crear un token complejo en la aplicación, hecho de la marca de tiempo + appId + cualquier otro valor que pueda replicar en el servidor, y autenticar en el encabezado de cada solicitud usando esos.
Por ejemplo, podría crear un "usuario" virtual en su base de datos y almacenar en él el DeviceToken y utilizarlo para su algoritmo.
Personalmente, mantengo una solicitud de API pública, que es la que obtiene la marca de hora, que devuelve la marca de hora del servidor para utilizarla en 300 segundos.
así que antes de cada solicitud, obtenga la marca de tiempo y envíe su token creado, replíquelo en el servidor y, por lo tanto, autentique la solicitud.
Un hacker mediocre puede aplicar ingeniería inversa a la aplicación y replicar tus tokens