Estoy creando un enorme juego móvil en línea. Tengo algunas preguntas para ustedes, porque mi conocimiento sobre criptografía y envío de datos a través de la red de manera segura es un poco escaso.
Algunos detalles:
- Cada usuario tiene una cuenta
- Para iniciar sesión, debe proporcionar su nombre de usuario y contraseña (a través de la aplicación, no del navegador web)
- Los datos se transfieren del cliente (dispositivo móvil) al servidor en algún lugar.
Simple! Ok, como sé, la autenticación web normal está protegida por SSL, que es simplemente "enviar sin problemas, estás a salvo".
En el dispositivo móvil no puedo usar SSL (incluso si Android proporciona algunos métodos, simplemente no puedo porque estoy transfiriendo mi juego a iOS, usando diferentes motores de juegos / redes, etc.).
Tengo que hacer que el proceso de "envío y recepción" sea seguro para que una tercera persona no capture las credenciales del usuario.
Mientras leo, la mejor forma de realizar esto es el método RSA , que utiliza claves públicas y privadas para cifrar / descifrar paquetes.
Por lo que sé, funciona como:
- hay dos claves, privada, pública y un mensaje: "mensaje".
- cualquiera puede obtener una clave pública (porque es pública)
- solo el servidor tiene acceso a la clave privada
- cualquiera puede cifrar el "mensaje" con la clave pública y siempre se verá igual (el mismo mensaje cifrado con la misma clave pública)
- el mensaje cifrado se puede descifrar de una sola manera: utilizando una clave privada y se verá como el primer mensaje: "mensaje".
- las claves públicas y privadas no son iguales, pero utilizan diferentes algoritmos de cifrado / descifrado, por lo que funciona de forma mágica para que al final el mensaje sea el mismo
¡Por favor, corrígeme si me equivoco!
Y aquí están mis preguntas:
- ¿Tengo razón en el ejemplo anterior, que los paquetes enviados de esta manera (y que la clave pública es realmente pública) están asegurados (por supuesto, cualquier cosa se puede descifrar) pero, sabes, está "seguro"?
- ¿Debería cada usuario tener su propio par de claves?
- ¿Cuándo debo generar un nuevo par de claves? ¿Con cada login?
- ¿Cuándo debo enviar una clave pública al usuario? ¿Cuando hace clic en 'registrar' o 'iniciar sesión' (con campos de texto ya llenos con los datos)? ¿O cuando abre la aplicación?
Si hubiera alguien que pudiera explicar estas cosas un poco, ¡se lo agradecería! :)
Dos preguntas adicionales para @Luke Park
La clave pública es pública y usted dijo que no debería enviarse a través de la red. ¿Significa que con una clave pública el usuario puede descifrar los datos de alguna manera?
Y el segundo: Usted dijo que debería empaquetar la clave pública con la aplicación. Si la clave pública también es una herramienta peligrosa en manos de un pirata informático, ¿es aconsejable almacenarla en un código? Como sé, hay formas de recuperar los datos del programa compilado.
Y un extra! Si la clave está empaquetada (probablemente codificada), ¿debería permanecer siempre igual o debería cambiar el par (generar nuevo)? Mientras leo en alguna parte, al tener una clave pública 'pública' es posible descifrar los datos (toma algún tiempo, pero es posible).