¿Hay una manera de verificar si los datos no se alteran durante el envío a un servicio web (utilizando la conexión HTTP)?

Estoy trabajando en un proyecto de Android que envía datos a mi Webservice y los almacena en mi base de datos. Estoy usando un protocolo HTTP para conectarse a mi webservice. Uso de JSON para el formato de datos.

Envío al webservice los datos y el HASH (SHA256) de estos datos.

Antes de almacenar los datos en la base de datos, verifico utilizando HASH si lo que he enviado (datos) es igual a lo que recibió The Webservice. Si no, envío un mensaje de error.

A veces los valores del HASH son diferentes que causan un mensaje de error, y no se almacenan datos en la base de datos

Así que mi pregunta: ¿Hay otro método para verificar si los datos no se alteran durante la operación de envío?

El hash parece funcionar para su escenario, ya que detecta las modificaciones de datos bastante bien.

Pero un hash puede ser alterado junto con los datos, por lo que esta no es una medida de seguridad contra atacantes maliciosos. Si le preocupa la seguridad, puede estar interesado en WS-Security .

Esencialmente, debe utilizar un canal cifrado (HTTPS) o firmar su mensaje.

Si no confía en el canal, debe utilizar HTTPS. Eso es todo. Tratar de construir su propio mecanismo de verificación de integridad está tratando de diseñar su propio protocolo de seguridad y eso es lo último que quiere hacer.

En cualquier caso, un hash sin clave (como SHA256) que está utilizando es insuficiente. Un adversario que es capaz de modificar el mensaje también es capaz de recalcular el hash del texto modificado y enviarlo junto con el mensaje. Necesitará una primitiva más fuerte: el MAC (Message Authentication Code) http://en.wikipedia.org/wiki/Message_authentication_code

HTTPS le dan esto y más.

Hashing techniques sería la mejor opción aquí.

Puede utilizar cualquier algoritmo de hashing como HmacSHA1 o MD5 , etc.

Cuando está pasando sus datos al servidor mediante Post o Get , primero, cree un token a partir de los datos utilizando cualquier algoritmo de hashing. (Vea a continuación la función que convierte los datos en HMAC SHA1)

Cuando pase estos datos, pase el token también al servidor. Ahora el servidor también usará el mismo algoritmo hash que el cliente ha utilizado, y el servidor creará el token de los datos que se pasan con la solicitud.

Después de que el servidor coincidirá con el token generado con el token pasado con la solicitud.

Si ambos tokens coinciden, los datos que se pasan con la petición no se alteran de lo contrario los datos se alteran.

Puede utilizar el método siguiente para crear un token para sus datos:

  /** * Encrypts the data passed to it using Hmac-SHA1. * * @param dataToEncrypt * data that is to be encrypted. * @return The token that is generated after encrypting data. */ public static String convertDataToHmacSHA1(final String dataToEncrypt) { String returnString; try { // Get an hmac_sha1 key from the raw key bytes final byte[] keyBytes = HMAC_SHA1_KEY.getBytes(); final SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); // Get an hmac_sha1 Mac instance and initialize with the signing key final Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); // Compute the hmac on input data bytes final byte[] rawHmac = mac.doFinal(dataToEncrypt.getBytes()); final StringBuffer stringBuffer = new StringBuffer(); for (byte b : rawHmac) { stringBuffer.append(String.format("%02x", b)); } returnString = stringBuffer.toString(); Log.e("Token", returnString); return returnString; } catch (Exception e) { Log.e(TAG, "" + e); } return returnString; } 

En la actualidad se utiliza un hash para verificar la integridad de los datos – asumiendo que utiliza el mismo hash exacta en ambos extremos esto significa que está recibiendo datos dañados.

En lugar de sólo detectar coruuption de datos que podría codificar los datos en un código de corrección de errores para que pueda reconstruir los datos originales en el extremo de recepción, incluso si se corrompió en el camino

Usted puede encontrar una biblioteca en la respuesta a esta pregunta – Java: ECC (código de corrección de errores) de la biblioteca?

Creo que tu método es bueno.

Tienes una solución pesada en 3 pasos: paso 1: envía los datos a android paso 2: android recibe los datos e informa al servidor web de qué obtiene el paso 3: el servidor comprueba cada campo e informa a android si el orverall es correcto o no .

Pero creo que esta solución es demasiado pesada para la mayoría de los casos, fue para responder a su pregunta si hay otra solución o no.

¿Necesita leer los datos, si no sólo hash una vez y comparar los hashes.

Dependiendo de la frecuencia del hash estar equivocado podría dar a la aplicación cinco intentos de hacerlo bien antes del mensaje de error.

¿Has probado otros algoritmos como md5, maduro o crc? Tal vez son más eficientes.

En mi experiencia para la cadena pequeña uso crc pero para los detalles de inicio de sesión voy con sha256 o sha512 y sólo hash la contraseña y comparar los hashes. Entonces usted no tiene contraseñas sentadas en su base de datos.

¡Espero que esto ayude!

Corregirme si estoy equivocado, pero está hash en un intento de detectar una de dos cosas.

  1. Detecta un "Hombre en el ataque medio". (MITM) Vea aquí para más información .
  2. Detectar una red no confiable.

@Samuel Edwin Ward y @radai estaban hablando de estos dos arriba .

Ambas preocupaciones tienen razonablemente buenas soluciones existentes que NO implican que explícitamente hash sus datos.

En primer lugar, para reducir la probabilidad de un ataque MITM, use HTTPS . El cliente puede establecer la identidad del servidor con cierta confianza, y también hace bastante bien el trabajo de prevenir el espionaje.

En segundo lugar, para tratar sus preocupaciones sobre una red poco confiable, utilice TCP …

TCP proporciona entrega confiable y ordenada de una secuencia de octetos desde un programa en un equipo a otro programa en otro equipo. Wikipedia

Supongo que no has hecho nada especial (como usar una red UDP o algo así), y tu servicio web ya usa TCP.

Los problemas que está viendo con su comparación de hashing es probable que se deba a un supuesto incorrecto en la lógica de su aplicación. Yo sugeriría que usted está comparando hashes de las cosas equivocadas.

Como uno de los muchos ejemplos que vienen a la mente, algunos servidores web agregarán cosas a la solicitud HTTP a medida que se procesa. Así es como funcionan los proxies, por ejemplo. Esto le dará resultados diferentes al comparar un hash de la solicitud HTTP enviada por el dispositivo y un hash de la solicitud HTTP que eventualmente recibió el servidor web.

Le sugiero que lea los enlaces en línea que he proporcionado para asegurarse de que sus preocupaciones sobre datos dañados han sido en gran medida abordados por las soluciones existentes. Si no lo son, al menos tendrás una mejor comprensión de por qué sientes que necesitas hash tus datos. 🙂

  • Desarrollador web visual Servicio web en depuración HTTP / 1.1 400 Solicitud incorrecta
  • Datos de servicio web de caché de android
  • ¿Cómo conectarse a una base de datos remota con Webservices?
  • Cómo utilizar parámetros con HttpPost
  • Android: ¿Es una buena idea almacenar Token de autenticación en las preferencias compartidas?
  • Creación de servicio web para aplicaciones de Android
  • Error: NullPointerAccess: La variable "" sólo puede ser null en esta ubicación
  • ¿Cómo puedo recibir notificaciones múltiples usando GCM sin reemplazar la precedente?
  • Cómo llamar a un servicio web SOAP en Android
  • Android Fatal señal 11 (SIGSEGV) en 0x00000040 (código = 1) Error
  • Solicitudes seguras de servicio web
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.