Comprobando una cadena almacenada localmente en busca de manipulación

3

Estoy trabajando en un juego multijugador usando WebSockets. He decidido que todos los datos de los usuarios se almacenarán en el cliente, eliminando la necesidad de autenticación mediante contraseñas, etc.

LocalStorage
'save' -> '{"key":"value", "key2":"value2"}'
'hash' -> '<hash of save>'

La idea es almacenar los datos del usuario en texto plano, pero también almacenar un hash que solo puede calcular el servidor (ejecutando Node.JS). El cliente enviará tanto el save como el hash al servidor para que sea verificado y cargado en la memoria para esta sesión.

Ahora, mi pregunta es:

  • Si uso SHA256 para hacer un hash de todos los datos save , ¿cómo puedo evitar que un usuario genere su propio hash para los datos?
  • Luego, (suponiendo que la respuesta a la parte 1 sea 'sal',) ¿el uso de sal me mantendrá a salvo o se puede calcular esto? (Puedo hacer la sal en parte diferente para cada usuario)
pregunta Peter Gordon 02.09.2016 - 21:19
fuente

2 respuestas

4

Lo que desea es algo que garantice la integridad de sus datos.

La solución más común para esto es usar un HMAC, que es un resumen con clave. NodeJS tiene una API que calcula HMACs . En comparación con un hash "salado", donde se mantendría la sal en privado, los HMAC están diseñados para ser seguros incluso contra algunos ataques adicionales, como los ataques de extensión de longitud.

Mientras mantengas la clave privada (y lo suficientemente grande), deberías poder usar la misma clave para todos los usuarios.

Tenga en cuenta que esto no evitará que las personas le envíen una versión anterior de los datos. Todo lo que hace es garantizar que los datos fueron válidos en algún momento. Si desea asegurarse de que le envían la última versión, necesitará un poco de almacenamiento del lado del servidor para almacenar un número de versión, una marca de tiempo o el último resumen de datos. Si elige almacenar el último compendio, un hash normal será suficiente, no tendrá que enviar el hash o un HMAC al cliente.

    
respondido por el user2313067 02.09.2016 - 22:47
fuente
1

No, sal (en sentido clásico, el valor conocido tanto por el servidor como por el cliente) no será de ayuda.

Al generar el hash, el servidor debe cifrarlo utilizando un secreto conocido solo por sí mismo (y nunca por cualquier cliente), y al recibirlo, descifre y luego verifique.

Pero supongo que con sal probablemente quiso decir que se ha copiado una cantidad (con suerte bastante grande) de datos secretos solo del servidor a save de datos, y luego hacer SHA3 (o HMAC) en ese resultado. Sí, eso también sería lo suficientemente seguro. (Pero asegúrese de que el secreto sea razonablemente grande para que el usuario no pueda hacer fuerza bruta; mejor aún, prepare un gran secreto y agregue otro gran secreto para una mayor capacidad de recuperación).

Como mencionó @AgentME en los comentarios, tenga cuidado con el algoritmo de hash utilizado debido a que algunos de ellos son sospechosos de ataque de extensión de longitud

    
respondido por el Matija Nalis 02.09.2016 - 22:13
fuente

Lea otras preguntas en las etiquetas