Compartir a través de


Nombres seguros mejorados

Una firma de nombre seguro es un mecanismo de identidad en .NET Framework para identificar ensamblados. Se trata de una firma digital de clave pública que normalmente se usa para comprobar la integridad de los datos que se pasan de un originador (firmante) a un destinatario (comprobador). Esta firma se usa como identidad única para un ensamblado y garantiza que las referencias al ensamblado no sean ambiguas. El ensamblado se firma como parte del proceso de compilación y, a continuación, se comprueba cuando se carga.

Las firmas de nombre seguro ayudan a evitar que las partes malintencionadas manipule un ensamblado y, a continuación, vuelvan a firmar el ensamblado con la clave del firmante original. Sin embargo, las claves de nombre seguro no contienen información confiable sobre el publicador ni contienen una jerarquía de certificados. Una firma de nombre seguro no garantiza la confiabilidad de la persona que firmó el ensamblado o indica si esa persona era un propietario legítimo de la clave; indica solo que el propietario de la clave firmó el ensamblado. Por lo tanto, no se recomienda usar una firma de nombre seguro como validador de seguridad para confiar en código de terceros. Microsoft Authenticode es la manera recomendada de autenticar código.

Limitaciones de los nombres fuertes convencionales

La tecnología de nomenclatura sólida que se usa en versiones anteriores a .NET Framework 4.5 tiene las siguientes deficiencias:

  • Las claves están constantemente bajo ataque y las técnicas mejoradas y el hardware facilitan la inferencia de una clave privada de una clave pública. Para protegerse contra ataques, se necesitan claves más grandes. Las versiones de .NET Framework anteriores a .NET Framework 4.5 proporcionan la capacidad de firmar con cualquier clave de tamaño (el tamaño predeterminado es de 1024 bits), pero la firma de un ensamblado con una nueva clave interrumpe todos los archivos binarios que hacen referencia a la identidad anterior del ensamblado. Por lo tanto, es extremadamente difícil actualizar el tamaño de una clave de firma si desea mantener la compatibilidad.

  • La firma con nombre seguro solo admite el algoritmo SHA-1. SHA-1 recientemente se ha descubierto que no es adecuado para aplicaciones de hashing seguras. Por lo tanto, es necesario un algoritmo más seguro (SHA-256 o superior). Es posible que SHA-1 pierda su posición compatible con FIPS, lo que presentaría problemas para aquellos que eligen usar solo algoritmos y software compatibles con FIPS.

Ventajas de nombres fuertes mejorados

Las principales ventajas de los nombres seguros mejorados son la compatibilidad con nombres seguros preexistentes y la capacidad de reclamar que una identidad es equivalente a otra:

  • Los desarrolladores que tienen ensamblados firmados preexistentes pueden migrar sus identidades a los algoritmos SHA-2, a la vez que mantienen la compatibilidad con ensamblados que hacen referencia a las identidades antiguas.

  • Los desarrolladores que crean nuevos ensamblados y no se preocupan por firmas de nombre fuerte preexistentes pueden usar los algoritmos más seguros de SHA-2 y firmar los ensamblados como siempre lo han hecho.

Uso de nombres seguros mejorados

Las claves de nombre seguro constan de una clave de firma y una clave de identidad. El ensamblado se firma con la clave de firma y se identifica mediante la clave de identidad. Antes de .NET Framework 4.5, estas dos claves eran idénticas. A partir de .NET Framework 4.5, la clave de identidad sigue siendo la misma que en versiones anteriores de .NET Framework, pero la clave de firma se mejora con un algoritmo hash más seguro. Además, la clave de firma se firma con la clave de identidad para crear una contra-firma.

El AssemblySignatureKeyAttribute atributo permite que los metadatos del ensamblado usen la clave pública preexistente para la identidad del ensamblado, lo que permite que las referencias de ensamblado antiguas sigan funcionando. El AssemblySignatureKeyAttribute atributo utiliza la contrafirma para asegurarse de que el propietario de la nueva clave de firma también sea el propietario de la clave de identidad antigua.

Firmar con SHA-2, sin migración de claves

Ejecute los comandos siguientes desde un símbolo del sistema para firmar un ensamblado sin migrar una firma de nombre seguro:

  1. Genere la nueva clave de identidad (si es necesario).

    sn -k IdentityKey.snk  
    
  2. Extraiga la clave pública de identidad y especifique que se debe usar un algoritmo SHA-2 al firmar con esta clave.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Retrase la firma del ensamblado con el archivo de clave pública de identidad.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Vuelva a firmar el ensamblado con el par de claves de identidad completa.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Inicio de sesión con SHA-2, con migración de claves

Ejecute los comandos siguientes desde un símbolo del sistema para firmar un ensamblado con una firma de nombre seguro migrada.

  1. Genere un par de claves de identidad y firma (si es necesario).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Extraiga la clave pública de firma y especifique que se debe usar un algoritmo SHA-2 al firmar con esta clave.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Extraiga la clave pública de identidad, que determina el algoritmo hash que genera una contrafirma.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Genere los parámetros de un AssemblySignatureKeyAttribute atributo y adjunte el atributo al ensamblado.

    sn -a IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk  
    

    Esto produce una salida similar a la siguiente.

    Information for key migration attribute.
    (System.Reflection.AssemblySignatureKeyAttribute):
    publicKey=
    002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519
    d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936
    e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b4
    3893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a3
    4d153cdd
    
    counterSignature=
    e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91eb
    e1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8
    ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3
    ae5fec2c682e57b7442738
    

    Luego este resultado se puede transformar en AssemblySignatureKeyAttribute.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Retrase la firma del ensamblado con la clave pública de identidad.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Firme por completo el ensamblado con el par de claves de firma.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Consulte también