Pregunta

Así que supongamos que tiene dos clientes, C1 y C2, cada cliente tiene un GUID asociado a él.

¿Cómo hacer que, cuando se recibe un mensaje en el C2 que supuestamente proviene de C1 (comprobando el GUID y viendo que coincide con el GUID de C1), pero puesto que el mensaje no se garantiza que han venido de C1 (C3 sólo podría haber enviado el mensaje, enviando el GUID de C1 en la cabecera del mensaje) que tiene que haber algún tipo de verificación que el mensaje procede realmente de C1.

He estado buscando en el uso de la encriptación asimétrica (RSA) para tener C1 enviar un mensaje que consiste en [C1.GUID; RSAEncrypt(C2.PUBLIC_KEY, C1.GUID); MESSAGE], y luego dejar C2, básicamente, hacer una verificación de esta manera (pseudo código Python):

message.GUID == RSADecrypt(C2.PRIVATE_KEY, message.ENCRYPTED_GUID)

Es este un enfoque viable? ¿O hay alguna otra forma inteligente / más evidente para verificar el remitente de un mensaje?

¿Fue útil?

Solución

asimétrico algoritmos se han inventado para tales fines, que es la forma de trabajo digital de firmas.

Sin embargo, su enfoque tiene algunos problemas. Cualquier persona con la clave pública del destinatario podía falsificar la firma. Además, la firma no cambia en absoluto! Cualquier persona que intercepte los mensajes falsos pueden ser un emisor válido. El propósito de cifrado asimétrico es derrotar a estos problemas con los intercambios de claves, está el concepto de la firma digital, que es básicamente un hash cifrado asimétricamente del mensaje que está lanzando alrededor.

Para RSA, que tiene que hacer un poco más con el fin de crear una firma digital desde el algoritmo básico, ver Wikipedia para más detalles: http://en.wikipedia.org/wiki/RSA#Signing_messages

Yo sólo haría uso de un algoritmo de firma digital a partir de una biblioteca. En primer lugar la búsqueda de Google se presenta con este para Python:

http://www.example-code.com/python/pythonrsa.asp

http://www.chilkatsoft.com/dsa-python.asp

Otros consejos

El problema con este método es que cualquier máquina podría entonces capturar el GUID y RSA-cifrado-GUID y pasarlos a la misma. Realmente no se ha creado ningún criterio de desafío / respuesta única que sólo puede adivinarse por el cliente receptor. Lo que tendría que sería algo que es completamente único y no se puede conseguir simplemente mirando a los parámetros pasados. Tal vez algo como:

[ClientName; RSA-ENCRYPTED(GUID+Timestamp); MESSAGE]

En este método, el cifrado RSA se realiza utilizando la clave pública del Cliente2 por lo que sólo la clave privada de Cliente2 podría desbloquearlo. Utilizando el ClientName, Cliente2 pudo recuperar el GUID que se espera de un origen de datos, y luego que coincida con el GUID devuelto en contra de la una de la encriptación. He incorporado el uso de una marca de tiempo como una sal de manera que la cadena cifrada sale diferente cada vez. Se considera muy débil para utilizar una marca de tiempo como una asignación al azar de una sal, pero se pone el punto a través. podrían implementarse otros algoritmos más seguros / azar.

Cualquier persona espiar mensajes entre un cliente y el servidor será capaz de forjar nuevos mensajes, tiene GUID del cliente nunca cambiar, ni RSA-ENCRYPTED-GUID.

considerar el cambio a este modelo mensaje:. [GUID; ENCRYPTED_CONTENT_CHECKSUM; CONTENT]

Checksum(message.CONTENT) == 
    RSADescrypt(C1.PUBLIC_KEY, message.ENCRYPTED_CONTENT_CHECKSUM)

Sin embargo, cualquier persona puede volver a enviar mensajes de espiar los mensajes previamente enviados.

Pública y claves privadas son el camino a seguir. Voy a suponer que no se preocupan por el cifrado de los datos, sino que usted cuidado de que los datos son "autorizado".

Digamos que tiene 3 ordenadores

COMP1 comp2 Comp3

También digamos que usted quiere COMP1 para enviar un mensaje a Comp3. no le importa si el mensaje fue interceptado, pero lo hace especial cuidado de que no se forjó.

COMP1 firmará digitalmente el mensaje con su clave privada

Comp2 interceptará el mensaje de COMP1 a Comp3, pero no puede cambiar el mensaje sin invalidar la firma

Comp2 reenviará el mensaje a Comp3

Comp3 utilizará la clave pública del COMP1 para descifrar la firma y usar el hash de la firma para validar el contenido.

Ahora bien, si desea cifrar los datos, es necesario agregar un paso adicional

COMP1 firmará digitalmente el mensaje con su clave privada

COMP1 generará una clave de cifrado aleatoria (típicamente AES) y cifrar el mensaje.

COMP1 tomará esa clave de cifrado y cifrar con la clave pública del Comp3

Comp2 interceptará el mensaje, pero no puede leerlo sin Comp3 de clave privada

Comp2 reenviará el mensaje a Comp3

Comp3 lo utilizará de clave privada para descifrar la clave AES

Comp3 descifrará el mensaje completo utilizando la clave AES

Comp3 validará el mensaje mediante el descifrado de la firma con la clave pública del COMP1.

La firma contiene un hash del mensaje, si el hash y coincidencia hash del mensaje, entonces los datos está intacta.

Puede incluir los GUID en la carga útil para su uso como una búsqueda para decidir qué claves públicas para su uso.

P.S. Usted tendrá que utilizar el construido en métodos para firmar un mensaje. Deje que el Marco de hacer el hash / etc

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top