2012-01-21 27 views
16

He creado una aplicación web con Java EE 6 (utilizando implementaciones de referencia) y quiero exponerla como un servicio web REST.Cómo proteger un servicio web REST en Java EE 6

El fondo es que quiero ser capaz de recuperar datos de la aplicación web a una aplicación de iOS que hice. La pregunta es ¿cómo puedo asegurar la aplicación? Solo quiero que mi aplicación use el servicio web. ¿Es eso posible y cómo podría hacer esto? Solo necesito saber qué debo buscar y leer, y no el código real.

+10

por qué en la tierra cualquier persona votar para cerrar esta? –

+2

¿Cuidar para explicar downvoter? – LuckyLuke

Respuesta

8

Desafortunadamente su servicio web nunca será completamente segura pero aquí están algunas de las cosas básicas que puede hacer:

  • Usar SSL
  • Wrap todo su (app) cargas útiles de salida en POST solicitudes. Esto evitará que el espionaje casual descubra cómo funciona su servicio web (para poder realizar una ingeniería inversa del protocolo).
  • Valide de alguna manera a los usuarios de su aplicación. Idealmente, esto involucrará a OAUTH, por ejemplo, usando credenciales de Google, pero se entiende la idea.

Ahora voy a señalar por qué esto no se sea completamente segura:

  • Si alguien obtiene una suspensión de su aplicación y la ingeniería inversa, todo lo que acaba de hacer está fuera de la ventana. Lo único que se mantendrá es su validación usuario.
  • Incrustar un certificado de cliente (como han señalado otras personas) no hace nada para ayudarlo en este escenario. Si solo reinvierto el desarrollo de su aplicación, también tengo su certificado de cliente.

Lo puede hacer usted?

  • Valida las cuentas en tu back-end y supervisa el uso anómalo.

Por supuesto, todo esto se va por la ventana cuando alguien viene, realiza una ingeniería inversa de su aplicación, construye otra para imitarla, y usted (generalmente) no sabría nada mejor. Todos estos son solo puntos a tener en cuenta.

Editar: Además, si no era ya evidente, utilizar POST (o GET) las solicitudes de todos los consultas de la aplicación (en su servidor). Esto, combinado con SSL, debería frustrar a tus fisgones casuales.

Edit2: Parece como si estoy re mal: POST siendo más seguras que las GET. This respuesta fue bastante útil al señalar eso. Así que supongo que puede usar GET o POST de manera intercambiable aquí.

+0

Veo, no necesito asegurarlo como banco :) Solo quiero al menos limitar o detener la manera más obvia de que las personas puedan usar la API. – LuckyLuke

+0

@Pjotr ​​Entonces sí, SSL y envolver todas sus cargas útiles en solicitudes 'POST' deberían hacer lo que necesita. Solo quería señalar dónde podría ir mal. –

+0

¿cómo es POST de alguna manera más segura que GET? –

4

Depende de qué tan seguro lo desee.

  • Si no te importa, solo inserta una palabra secreta en tu aplicación e inclúyela en todas las solicitudes.
  • Si te importa un poco más haz lo anterior y solo expone el servicio a través de https.
  • Si desea que sea seguro, emita un certificado de cliente para su aplicación y solicite que un certificado de cliente válido esté presente cuando se acceda al servicio.
+0

Solo necesito algo de seguridad básica :) Entonces, ¿qué dices es que puedo enviar un parámetro como este: "MyMagicKey": "MagicNumber030349" desde la aplicación iOS y verificar que coincida en mi aplicación web? – LuckyLuke

+0

Sí. Pero esto proporciona solo un nivel de seguridad muy básico, por supuesto, ya que es trivial husmear en estas solicitudes. Si usa https, será mucho más difícil (pero aún es muy posible, solo requiere habilidades superiores al promedio) resolverlo. –

0

Cree una regla en la máquina que aloja su servicio web para permitir que su aplicación solo acceda a través de algún puerto. En Amazon EC2, esto se hace creando una regla en el Grupo de seguridad de la instancia.

1

mis sugerencias son:

  1. uso https en lugar de http. hay certificado ssl libre disponible, obtener uno e instalarlo.
  2. utilizan una ruta de acceso compleja como 4324234AA_fdfsaf/como el punto final raíz.

debido a la naturaleza de protocolo http, la parte de la trayectoria es cifrado en la solicitud https. por lo tanto, es muy seguro. hay formas de descifrar la solicitud a través del ataque man-in-the-middle, pero requiere un control total sobre el dispositivo cliente, incluido la instalación de un certificado ilegal ssl. pero, pasaría más tiempo en mi aplicación para que tenga éxito.

+0

en https toda la solicitud está encriptada, no solo la url. –

+1

no, el nombre del servidor y/o la dirección IP no. – wangii

+0

um ... obviamente sí, la dirección a la que se conecta no está encriptada. –