Nombres seguros mejoradosEnhanced strong naming

Una firma de nombre seguro es un mecanismo de identidad de .NET Framework para identificar ensamblados.A strong name signature is an identity mechanism in the .NET Framework for identifying assemblies. Es una firma digital de clave pública que se suele usar para comprobar la integridad de los datos que se pasan de un remitente (firmante) a un destinatario (comprobador).It is a public-key digital signature that is typically used to verify the integrity of data being passed from an originator (signer) to a recipient (verifier). Esta firma se usa como identidad única para un ensamblado y garantiza que las referencias al ensamblado no son ambiguas.This signature is used as a unique identity for an assembly and ensures that references to the assembly are not ambiguous. El ensamblado se firma como parte del proceso de compilación y, después, se comprueba cuando se carga.The assembly is signed as part of the build process and then verified when it is loaded.

Las firmas de nombre seguro ayudan a impedir que personas malintencionadas manipulen un ensamblado y vuelvan a firmarlo con la clave del firmante original.Strong name signatures help prevent malicious parties from tampering with an assembly and then re-signing the assembly with the original signer’s key. Pero las claves de nombre seguro no contienen información confiable sobre el publicador ni una jerarquía de certificados.However, strong name keys don’t contain any reliable information about the publisher, nor do they contain a certificate hierarchy. Una firma de nombre seguro no garantiza la confiabilidad de la persona que ha firmado el ensamblado ni indica si dicha persona era el propietario legítimo de la clave; solo indica que el propietario de la clave ha firmado el ensamblado.A strong name signature does not guarantee the trustworthiness of the person who signed the assembly or indicate whether that person was a legitimate owner of the key; it indicates only that the owner of the key signed the assembly. Por lo tanto, no se recomienda usar una firma de nombre seguro como validador de seguridad para código de terceros de confianza.Therefore, we do not recommend using a strong name signature as a security validator for trusting third-party code. La manera recomendada de autenticar el código es Microsoft Authenticode.Microsoft Authenticode is the recommended way to authenticate code.

Limitaciones de los nombres seguros convencionalesLimitations of conventional strong names

La tecnología de nomenclatura segura usada en las versiones anteriores a .NET Framework 4.5 tiene las limitaciones siguientes:The strong naming technology used in versions before the .NET Framework 4.5 has the following shortcomings:

  • Las claves se encuentran constantemente bajo ataque, y las técnicas y el hardware mejorados hacen que sea más fácil deducir una clave privada a partir de una clave pública.Keys are constantly under attack, and improved techniques and hardware make it easier to infer a private key from a public key. Para protegerse contra los ataques, son necesarias claves más largas.To guard against attacks, larger keys are necessary. Las versiones de .NET Framework anteriores a .NET Framework 4.5 ofrecen la posibilidad de firmar con una clave de cualquier tamaño (el tamaño predeterminado es de 1024 bits), pero si se firma un ensamblado con una clave nueva, se interrumpen todos los binarios que hacen referencia a la identidad anterior del ensamblado..NET Framework versions before the .NET Framework 4.5 provide the ability to sign with any size key (the default size is 1024 bits), but signing an assembly with a new key breaks all binaries that reference the older identity of the assembly. Por lo tanto, es muy difícil actualizar el tamaño de una clave de firma si quiere mantener la compatibilidad.Therefore, it is extremely difficult to upgrade the size of a signing key if you want to maintain compatibility.

  • La firma con nombre seguro solo admite el algoritmo SHA-1.Strong name signing supports only the SHA-1 algorithm. Recientemente se ha descubierto que SHA-1 no es adecuado para las aplicaciones de hash seguro.SHA-1 has recently been found to be inadequate for secure hashing applications. Por lo tanto, es necesario un algoritmo más seguro (SHA-256 o superior).Therefore, a stronger algorithm (SHA-256 or greater) is necessary. Es posible que SHA-1 pierda su compatibilidad con FIPS, lo que causaría problemas a los clientes que deciden usar solo algoritmos y software compatibles con FIPS.It is possible that SHA-1 will lose its FIPS-compliant standing, which would present problems for those who choose to use only FIPS-compliant software and algorithms.

Ventajas de los nombres seguros mejoradosAdvantages of enhanced strong names

Las principales ventajas de los nombres seguros mejorados son la compatibilidad con los nombres seguros existentes y la capacidad de afirmar que una identidad es equivalente a otra:The main advantages of enhanced strong names are compatibility with pre-existing strong names and the ability to claim that one identity is equivalent to another:

  • Los desarrolladores que ya tengan ensamblados firmados pueden migrar sus identidades a los algoritmos SHA-2 y mantener la compatibilidad con los ensamblados que hacen referencia a identidades anteriores.Developers who have pre-existing signed assemblies can migrate their identities to the SHA-2 algorithms while maintaining compatibility with assemblies that reference the old identities.

  • Los desarrolladores que creen ensamblados y no se vean afectados por las firmas de nombre seguro existentes pueden usar los algoritmos SHA-2, que son más seguros, y firmar los ensamblados tal como han hecho siempre.Developers who create new assemblies and are not concerned with pre-existing strong name signatures can use the more secure SHA-2 algorithms and sign the assemblies as they always have.

Uso de nombres seguros mejoradosUse enhanced strong names

Las claves de nombre seguro se componen de una clave de firma y una clave de identidad.Strong name keys consist of a signature key and an identity key. El ensamblado se firma con la clave de firma y se identifica mediante la clave de identidad.The assembly is signed with the signature key and is identified by the identity key. Antes de .NET Framework 4.5, estas dos claves eran idénticas.Prior to the .NET Framework 4.5, these two keys were identical. 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 ha mejorado con un algoritmo hash más seguro.Starting with the .NET Framework 4.5, the identity key remains the same as in earlier .NET Framework versions, but the signature key is enhanced with a stronger hash algorithm. Además, la clave de firma se firma con la clave de identidad para crear una contrafirma.In addition, the signature key is signed with the identity key to create a counter-signature.

El atributo AssemblySignatureKeyAttribute permite que los metadatos del ensamblado usen la clave pública existente para la identidad del ensamblado, lo que permite que las referencias anteriores del ensamblado sigan funcionando.The AssemblySignatureKeyAttribute attribute enables the assembly metadata to use the pre-existing public key for assembly identity, which allows old assembly references to continue to work. El atributo AssemblySignatureKeyAttribute usa la contrafirma para asegurarse de que el propietario de la clave de firma nueva también es el propietario de la clave de identidad anterior.The AssemblySignatureKeyAttribute attribute uses the counter-signature to ensure that the owner of the new signature key is also the owner of the old identity key.

Firma con SHA-2, sin migración de claveSign with SHA-2, without key migration

Ejecute los comandos siguientes desde un símbolo del sistema para firmar un ensamblado sin migrar una firma de nombre seguro:Run the following commands from a command prompt to sign an assembly without migrating a strong name signature:

  1. Genere la nueva clave de identidad (si es necesario).Generate the new identity key (if necessary).

    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.Extract the identity public key, and specify that a SHA-2 algorithm should be used when signing with this key.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Retrase la firma del ensamblado con el archivo de clave pública de identidad.Delay-sign the assembly with the identity public key file.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Vuelva a firmar el ensamblado con el par de claves de identidad completa.Re-sign the assembly with the full identity key pair.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Firma con SHA-2, con migración de claveSign with SHA-2, with key migration

Ejecute los comandos siguientes desde un símbolo del sistema para firmar un ensamblado con una firma de nombre seguro migrada.Run the following commands from a command prompt to sign an assembly with a migrated strong name signature.

  1. Genere un par de claves de identidad y firma (si es necesario).Generate an identity and signature key pair (if necessary).

    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.Extract the signature public key, and specify that a SHA-2 algorithm should be used when signing with this key.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Extraiga la clave pública de identidad, que determina el algoritmo hash que genera una contrafirma.Extract the identity public key, which determines the hash algorithm that generates a counter-signature.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Genere los parámetros para un atributo AssemblySignatureKeyAttribute y adjunte el atributo al ensamblado.Generate the parameters for a AssemblySignatureKeyAttribute attribute, and attach the attribute to the assembly.

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

    Esto genera un resultado similar al siguiente.This produces output similar to the following.

    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.This output can then be transformed into an AssemblySignatureKeyAttribute.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Retrase la firma del ensamblado con la clave pública de identidad.Delay-sign the assembly with the identity public key.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Firme por completo el ensamblado con el par de claves de firma.Fully sign the assembly with the signature key pair.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Vea tambiénSee also