Forma correcta de firmar y verificar un mensaje

2

Tengo un objeto que necesito transmitir a los clientes y necesito que los clientes sepan que realmente creé el objeto. Obviamente, este proceso implica que yo firme el objeto con mi clave privada, de modo que los clientes puedan verificarlo con mi clave pública. El único problema que tengo es que hay algún procesamiento en otra aplicación que cambia algunas propiedades dentro de este objeto. Esto significa que no puedo firmar todo el objeto ya que la verificación fallará. Sin embargo, lo que realmente necesito verificar es la carga útil, que no cambia. El proceso que seguí es el siguiente. Déjeme saber si esta es la forma correcta de hacerlo y señale cualquier falla de seguridad que pueda haber.

  1. Agregué 2 propiedades en el objeto (SignedPayload y PublicKey)
  2. Crear un par de claves públicas / privadas
  3. Firmó la carga útil utilizando la clave privada y configuró SignedPayload
  4. Se agregó la clave pública a la propiedad PublicKey

La aplicación del medio ahora se verá afectada, y algunas propiedades van a cambiar, pero la carga no lo hará. En última instancia, los siguientes pasos se realizarán una vez que se reciba el mensaje en el cliente:

  1. Deserializó el mensaje
  2. Verifique el mensaje usando las propiedades PublicKey, Payload y SignedPayload. Si la carga útil ha cambiado o la clave pública no se origina en mi organización, el mensaje se ignora. Esto significa que tengo que firmar la clave pública.

Mis preguntas principales son:

  1. ¿Es seguro este enfoque?
  2. ¿Cómo firmo la clave pública para que el cliente pueda verificar que soy el propietario de la clave?
  3. De lo que he leído, es una práctica común Transmitir la clave pública al firmar y verificar datos. Es esto correcto?
  4. ¿Hay algún problema con el enfoque de crear un par de claves para cada ¿Mensaje, ya que siempre estoy transmitiendo la clave pública? La razón de esto es evitar tener que almacenar la clave privada en el servidor, que puede ser secuestrada.

Muchas gracias de antemano.

    
pregunta seedg 14.10.2015 - 10:37
fuente

1 respuesta

2

A menos que haya omitido un elemento importante, el enfoque del tour parece tener un defecto importante: está comprobando la validez de la carga útil utilizando la clave pública incluida con el mismo mensaje.

Por lo tanto, cualquiera puede forjar un paquete válido simplemente generando un nuevo par de claves, firmando la carga útil y adjuntando la clave pública al paquete. Es por eso que su primer paso siempre debe evaluar la validez de la clave pública.

Esto generalmente se hace al colocar la clave pública en un certificado firmado que describe la reclamación de identidad del originador y que el certificado ha sido firmado por una autoridad en la que el destinatario confía.

En cuanto a tus otras preguntas:

  

Sin pasar por una CA, ¿cómo puedo generar una PKI que yo mismo puedo verificar que yo, y nadie más, haya creado esa PKI?

Suponiendo que simplemente está haciendo un mal uso del acrónimo "PKI" para significar "par de clave pública / privada", entonces no puede: absolutamente necesita tener una forma de validar la clave pública en orden para validar el remitente del mensaje. De lo contrario, como describí, cualquiera podría crear un paquete.

Esa validación es para lo que es una CA: permite que el usuario final le diga que una clave pública determinada pertenece a una principio de seguridad .

Otra forma de validar dicha clave es usar un servidor de claves: un sistema que contenga la información que vincula una clave pública con un principal de seguridad. Esto se puede usar si desea crear un sistema de transporte semi-anónimo: si no desea que el destinatario pueda saber quién envió una carga útil específica pero quiere que pueda asegurarse de que tiene la autorización adecuada y, al al mismo tiempo, asegúrese de que el servidor central no pueda ver el contenido de cada carga útil. Sin embargo, no parece que estés implementando ese tipo de sistema.

  

Por lo que he leído, es una práctica común transmitir la clave pública al firmar y verificar datos. ¿Esto es correcto?

Debe proporcionar la clave pública al usuario final, sí. Pero la práctica común depende de lo que estás haciendo exactamente. En la mayoría de los casos, no solo tendrá la clave pública, sino también algún tipo de certificado digital que le permita al usuario final validar la clave en sí (si no tiene otro mecanismo para validar esa clave pública). En el caso de TLS, la práctica común es transmitir TODOS los certificados en la cadena de confianza (hasta la raíz) al cliente para que puedan verificar la cadena completa incluso si les falta un certificado intermedio.

  

¿Hay algún problema con el enfoque de crear una PKI para cada mensaje, ya que siempre estoy transmitiendo la clave pública?

No como tal, pero la creación de un par de claves es una operación delicada y que requiere muchos recursos. A menos que sea absolutamente necesario, normalmente no se implementa de esa manera.

    
respondido por el Stephane 14.10.2015 - 11:01
fuente

Lea otras preguntas en las etiquetas