2012-05-15 13 views
9

¿Alguien puede tranquilizarme y ver si esta configuración verificará que un archivo haya sido enviado por mí? Una idea de cuán seguro es esto sería genial y cualquier posible vector de ataque.Secure DSA Signing

  1. Cree una clave pública y privada con DSACryptoServiceProvider.
  2. Agregar clave pública como recurso de aplicación
  3. Hacer una alerta
  4. Obtener DSA de hash de actualización utilizando la clave
  5. Enviar hash y la actualización de la aplicación privada (Suponer que estos pueden ser interceptados/cambiado)
  6. Verificar hash es corregir usando clave pública.
  7. Si verificado aplicar la actualización de

La actualización es un exe y se ejecutará por lo que quiero para asegurarse de que no se ejecutará si alguien reemplaza o interfiera con ella.

EDITAR: Actualizó el punto 6 ya que la clave pública en realidad no genera un hash, simplemente lo verifica. Creo que es esta parte la que estoy luchando con la seguridad de.

+2

Ese es exactamente el algoritmo correcto, excepto que no tiene _hash_ con su clave privada; usted genera un hash y luego _encrypt el hash_ con su clave privada. El destinatario usa su clave _public_ para descifrar y verificar el hash. También estoy asumiendo que su clave privada reside en un medio aislado (una llave USB o una computadora no conectada a la red). :-) Su clave privada debe mantenerse en secreto, pero no es necesario mantener seguros todos los demás componentes (la actualización, el hash y la clave pública). –

+0

Gracias Adam, solo me falta un par de puntos. ¿Cómo obtengo el hash de DSACryptoProvider sin la clave privada? Pensé que hash = DSACryptoServiceProvider.fromxmlstring (privatekey) .signdata (fileToGetHashFrom) - Segundo punto. No creía que pudiera encriptar datos con DSA, ¿debería usar algo más? Además, normalmente no encriptas los datos con una clave pública y los descifras con una clave privada. Mi clave es la forma incorrecta en ese caso? Lo siento si estoy siendo estúpido aquí ;-) – Oli

+2

@Oli crear firmas digitales a menudo se describe como un proceso de 2 pasos que consiste en 1) generar un hash de los datos para firmar, luego 2) transformar el hash * usando * el clave privada, de manera que se pueda verificar con la clave pública y no se pueda falsificar. La naturaleza unidireccional del proceso de generación/verificación tiene similitudes con el cifrado/descifrado, utilizando solo las claves pública y privada "en reversa". 'DSACryptoServiceProvider' se ocupará de todos estos detalles exactamente de la manera en que lo ha comentado, pero creo que el punto de Adán es que la clave privada en sí misma no se usa para generar el hash. – shambulator

Respuesta

1

Su enfoque se ve bien. La pregunta que queda es qué tan segura es su aplicación en el cliente. ¿Hay alguna posibilidad de que alguien pueda manipular el ejecutable? ¿Tal vez cambiar la clave pública en el recurso de la aplicación?

Se está volviendo teórico aquí, pero sugiero una pequeña modificación al paso 6: Sea específico qué clave pública exacta desea usar. Si algún atacante pudiera cambiar la clave en el recurso de la aplicación, podría enviar un paquete modificado con un hash correcto para otra clave privada. Esto puede ser solo una preocupación menor ya que el atacante ya modificó su software. Pero si solo pudiera reemplazar el recurso de la aplicación y nada más, tendría la capacidad de permitir que su aplicación se actualice con su código malicioso.