Encriptación de cadenas C#

RyukInside

Bovino maduro
#1
Estoy creando una aplicación en la que cliente y servidor se intercambian mensajes.

Actualmente implementé dos encriptaciones, MD5 y Rijndael para asegurar el paquete (éste paquete corresponde a datos del login del usuario).

El problema es la llave para desencriptar. Que me recomiendan ustedes para asegurar tal llave?

Pensé en que fuera generada por medio de una ecuación matemática con una semilla aleatoria, a la vez la semilla sería enviada para generar la llave en cuestión.

Otra idea es dejar una llave maestra en una db en otro servidor pero leyendo sobre desensamblado y ensamblado de aplicaciones decidí abandonar esta posibilidad.

Una última idea es enviar un simple número aleatorio que corresponda a una posición en un array de llaves, pero si mediante desensamblado tal array es conocido darán con todas las llaves para cualquier mensaje.

Será que utilizando este último método con un ofuscado de código es seguro?

Acepto opiniones, ideas, etc.
 

ethush

Bovino maduro
#3
No es que no haya interesados en temas de seguridad, lo que pasa es que la codificación con MD5 es que es solo de "ida" que quiero decir, que no existe forma para descencriptarlo, en el otro caso, Rijndael tienes que usar certificados con firmas autorizadas desde el ensamblado de la aplicación (es la forma mas segura) pero al ser multiples usuarios estos mismos deben contener en ensamblado fiel para la decodificación de la cadena del mensaje.

Un metodo que a mi en lo personal me ha funcionado usando paso de objetos de datos (que al caso funciona con cualquier String) es hacerlo de forma binaria, recorriendo matematicamente con un algoritmo específico los pares de bits hacia la derecha o hacia la izquierda, es muy basico pero es bastante funcional.

Otro método funcional, es que el servidor de mensajes por cada mensaje que se envien entre dos clientes se genere una llave de codificación y decodificación entre los dos mensajes (recomiendo el uso de hilos) así cuando se envie el mensaje, internamente concatenes algún identificador con el que el receptor consulte al servidor de mensajes por la clave de decodificación, esto hace que sea un poco mas dificil la decodificación "al vuelo" del mensaje.

Espero haberte ayudado y que me hayas podido entender, muchas veces soy demasiado técnico al expresarme en estas áreas. :D
 

Zephyros

Bovino de la familia
#4
No es que no haya interesados en temas de seguridad, lo que pasa es que la codificación con MD5 es que es solo de "ida" que quiero decir, que no existe forma para descencriptarlo, en el otro caso, Rijndael tienes que usar certificados con firmas autorizadas desde el ensamblado de la aplicación (es la forma mas segura) pero al ser multiples usuarios estos mismos deben contener en ensamblado fiel para la decodificación de la cadena del mensaje.

Un metodo que a mi en lo personal me ha funcionado usando paso de objetos de datos (que al caso funciona con cualquier String) es hacerlo de forma binaria, recorriendo matematicamente con un algoritmo específico los pares de bits hacia la derecha o hacia la izquierda, es muy basico pero es bastante funcional.

Otro método funcional, es que el servidor de mensajes por cada mensaje que se envien entre dos clientes se genere una llave de codificación y decodificación entre los dos mensajes (recomiendo el uso de hilos) así cuando se envie el mensaje, internamente concatenes algún identificador con el que el receptor consulte al servidor de mensajes por la clave de decodificación, esto hace que sea un poco mas dificil la decodificación "al vuelo" del mensaje.

Espero haberte ayudado y que me hayas podido entender, muchas veces soy demasiado técnico al expresarme en estas áreas. :D
Muy buena explicación.

Al calce de la misma quiero agregar que MD5 no es un algoritmo de encriptación, ya que como menciona ethush, es en un solo sentido y para serlo debería ser reversible, el mismo es simplemente un generador de hashes.
Si se cuenta con una base enorme de hashes y sus correspondientes datos, es "posible" obtener a partir de esos hash, el texto original, lo que no significa que sea posible obtener de manera universal el texto original. De ahí que una buena contraseña como principio permite proteger aún más los accesos.

Como ejemplo:

Código:
http://www.techfreakstuff.com/2010/02/tools-decrypt-md5-hash-online.html
http://www.raymond.cc/blog/archives/2009/01/22/ask-raymond-how-to-decrypt-md5-hashed-strings/
Donde dan links a páginas que contienen enormes bases de hash y que podrían recuperar el texto original a partir del hash que se ingrese. Tanto más "común" la contraseña, el hash será más fácil de indexar y por lo tanto, de revertir.
 
#5
3DES

Utiliza la encriptacion 3DES!!
Funciona muy bien y es de dos vias. Adicionalmente puedes combinarla con el certificado X.509.
Saludos cordiales.
 
Arriba