c# - tokens - ¿Qué es un token de clave pública y cómo se calcula en los nombres fuertes de ensamblado?
token visual basic (6)
De ECMA-335:
Esta declaración se usa para almacenar los 8 bytes bajos del hash SHA-1 de la clave pública del originador en la referencia de ensamblado, en lugar de la clave pública completa.
Una referencia de ensamblado puede almacenar una clave pública completa o un "token de clave pública" de 8 bytes. Se puede usar para validar que la misma clave privada utilizada para firmar el ensamblado en tiempo de compilación también firmó el ensamblado utilizado en tiempo de ejecución. Ninguno de los dos debe estar presente, y aunque ambos pueden almacenarse, esto no es útil.[Justificación: la clave pública o el token de clave pública almacenados en una referencia de ensamblado se utilizan para garantizar que el ensamblado al que se hace referencia y el ensamblado realmente utilizado en tiempo de ejecución fueron producidos por una entidad que posee la misma clave privada y, por lo tanto, se puede suponer han sido destinados para el mismo propósito. Si bien la clave pública completa es criptográficamente más segura, requiere más almacenamiento en la referencia. El uso del token de clave pública reduce el espacio requerido para almacenar la referencia y solo debilita ligeramente el proceso de validación. fundamento final]
En cuanto a cómo se calcula el hash (supongo que puede ser lo que estás preguntando porque el token de clave pública no está "calculado"), de la misma especificación:
Los metadatos CLI le permiten al productor de un ensamble calcular un hash criptográfico de ese ensamblaje (usando la función hash SHA-1) y luego encriptarlo usando el algoritmo RSA (ver Partición I) y un par de claves público / privado del productor eligiendo. Los resultados de esto (una "firma digital SHA-1 / RSA") pueden almacenarse en los metadatos (§25.3.3) junto con la parte pública del par de claves requerido por el algoritmo RSA. La directiva .publickey se usa para especificar la clave pública que se usó para calcular la firma. Para calcular el hash, la firma se pone a cero, se calcula el hash y luego el resultado se almacena en la firma.
El proceso de firma Strong Name (SN) usa algoritmos de cifrado y cifrado estándar para la firma de nombres fuertes. Se genera un hash SHA-1 sobre la mayor parte del archivo PE. Ese valor hash está firmado por RSA con la clave privada SN. Para fines de verificación, la clave pública se almacena en el archivo PE, así como el valor hash firmado.
Excepto por lo siguiente, todas las partes del archivo PE son hash: • La entrada de la firma Authenticode: los archivos PE pueden ser autenticados. La firma authenticode está contenida en la entrada de 8 bytes en el desplazamiento 128 del directorio de datos de encabezado PE ("Tabla de certificados" en §25.2.3.3) y el contenido del archivo PE en el rango especificado por esta entrada de directorio. [Nota: en un archivo PE conforme, esta entrada será cero. nota final] • La gota de nombre fuerte: la entrada de 8 bytes en el desplazamiento 32 del encabezado CLI ("StrongNameSignature" en §25.3.3) y el contenido de los datos hash contenidos en este RVA en el archivo PE. Si la entrada de 8 bytes es 0, no hay una firma de nombre fuerte asociada. • La suma de comprobación del encabezado de PE: la entrada de 4 bytes en el desplazamiento 64 del encabezado de PE Campos específicos de Windows NT ("Comprobación de archivo" en §25.2.3.2). [Nota: en un archivo PE conforme, esta entrada será cero. nota final]
Puede descargar las especificaciones aquí de forma gratuita: http://www.ecma-international.org/publications/standards/Ecma-335.htm
¿Qué es un ''token de clave pública'' y cómo se calcula en los nombres fuertes de ensamblado?
En cuanto a su pregunta, "¿Cómo se calcula?", Es un hash SHA1.
Desde el blog de dot net :
Microsoft soluciona el problema de "hinchamiento de la clave pública" mediante el uso de un hash de la clave pública de la ensambladora fuertemente nombrada. Estos hashes se conocen como tokens de clave pública, y son los 8 bytes bajos del hash SHA1 de la clave pública del ensamblado fuertemente nombrado. Los hashes SHA1 son hashes de 160 bit (20 byte), y los 12 bytes superiores del hash simplemente se descartan en este algoritmo.
Son los bytes hash de la clave utilizada para firmar el ensamblaje.
Entonces, en lugar de enumerar cientos de dígitos hexadecimales para la clave, tiene algo más simple, pero con poco riesgo de colisiones.
Un token de clave pública se usa para identificar a la organización en un ensamblado con un nombre fuerte. Esta información se agrega a la metabase de conjunto. Asumo que Richard tiene razón sobre la forma técnica en que se almacena.
Si desea ver la metabase de un ensamblaje, use ILDASM. Puede profundizar en lo que está almacenado en la metabase además de ver el IL.
Si necesita generar un token de clave pública basado en una clave pública completa, este pequeño método estático funciona:
private static byte[] GetKeyTokenFromFullKey(byte[] fullKey)
{
SHA1CryptoServiceProvider csp = new SHA1CryptoServiceProvider();
byte[] hash = csp.ComputeHash(fullKey);
byte[] token = new byte[8];
for (int i = 0; i < 8; i++ )
token[i] = hash[hash.Length - (i+1)];
return token;
}
Puede obtener el PublicKeyToken de la línea de comandos VS escribiendo:
sn –T DLLName.dll