¿Cifrando un mensaje de formato fijo?

3

Estoy planeando enviar DOS piezas de información a través de Internet desde la máquina A

  1. Un identificador de sitio que será como:

    $ SiteName="EJEMPLO" (en texto plano)

  2. Texto codificado que será como:

    $ Secret = encrypt ($ SiteName .'- '. time (), $ key)

Cuando obtengo estos dos datos en la máquina B, busco la clave $ basada en SiteName. Si se descifra y me da "EJEMPLO", y dentro de unas 24 horas, lo considero una solicitud válida.

¿Es este un mecanismo seguro?

La metodología de cifrado es:

$encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $input, MCRYPT_MODE_CBC);
$transmitted = bin2hex($encrypted_string);
    
pregunta siliconpi 25.04.2011 - 05:28
fuente

2 respuestas

5

No describe el modelo de ataque (es decir, qué tipo de cosas puede querer lograr un atacante), por lo que tengo que hacer algunas conjeturas aquí ...

Lo primero que debes tener en cuenta es que estás cifrando el "Nombre del sitio", que también envías en texto claro, por lo que debes asumir que cualquier atacante que observe un mensaje en tránsito conoce el "Nombre del sitio". También cifra la hora actual, que es información pública (el atacante también tiene un reloj). El cifrado está destinado a transformar algunos datos de una manera que mantiene las cosas confidenciales, pero aquí la entrada a la función de cifrado es solo datos públicos. Por lo tanto, está utilizando un sistema de cifrado para algo que no sea para lo que fue diseñado, y eso es una preocupación.

Tal como lo describe, lo que parece estar buscando es una forma de autenticar un mensaje cronometrado: desea que la máquina B se asegure de que cualquier software que se ejecute en la máquina A produzca deliberadamente un blob determinado, que incluya la fecha y hora de producción . Esto requiere un Código de autenticación de mensaje , no cifrado. El MAC habitual es HMAC que utiliza una función de hash subyacente (en caso de duda, elija SHA-256); con PHP, vea la función hash_hmac() . Es posible hacer un MAC a partir de un sistema de encriptación, pero es algo complicado y no hay una razón a priori para creer que mcrypt_encrypt() hace algo que es un buen MAC; no es que sepa cómo romperlo, pero es mejor usar una herramienta que haya sido específicamente diseñada y estudiada para ser un buen MAC, y eso es HMAC. Así que desea que el mensaje de A contenga el Nombre del sitio, el tiempo de producción del mensaje y un MAC calculado sobre el Nombre del sitio y el tiempo de producción del mensaje, con $key como clave.

Por supuesto, nada impide que un atacante reproduzca un mensaje existente, lo que puede o no ser un problema para usted, dependiendo de qué hace la máquina B cuando recibe una "solicitud válida". Como nota al margen, depender de la hora actual tiene algunos problemas prácticos, ya que hay muchos usuarios que están muy contentos con el sistema apagado por unos pocos años (trabajo en el campo de firmas digitales y Los certificados X.509, que tienen fechas de validez, y un reloj del sistema sin configurar es la razón número 1 de la falla).

    
respondido por el Thomas Pornin 25.04.2011 - 16:40
fuente
0

Teniendo en cuenta los ataques de reproducción (como dijo Frankodwyer): Si marca la marca de tiempo y no permite demoras arriba, digamos, 2 segundos un adversario no podrá volver a jugar más tarde.

También me pregunto por qué tiene que transmitir sus datos binarios en texto sin formato. Pero recomendaría el uso de Base64, que le permitirá tener unos pocos bytes de ancho de banda;)

Por favor, sea más detallado sobre el escenario y trataré de ser más preciso :)

    
respondido por el freddyb 25.04.2011 - 14:18
fuente

Lea otras preguntas en las etiquetas