Opções do compilador C# para segurança

As opções a seguir controlam as opções de segurança do compilador. A nova sintaxe MSBuild é mostrada em Negrito. A sintaxe csc.exe mais antiga é mostrada em code style.

  • PublicSign / -publicsign: assine publicamente o assembly.
  • DelaySign / -delaysign: assine com atraso o assembly usando apenas a parte pública da chave de nome forte.
  • KeyFile / -keyfile: especifique um arquivo de chave de nome forte.
  • KeyContainer / -keycontainer: especifique um contêiner de chave de nome forte.
  • HighEntropyVA / -highentropyva: habilitar a ASLR (Randomização de Layout de Espaço de Endereço) de alta entropia

PublicSign

Essa opção faz com que o compilador aplique uma chave pública, mas, na verdade, não assina o assembly. A opção PublicSsign também define um bit no assembly que informa ao runtime que o arquivo realmente está assinado.

<PublicSign>true</PublicSign>

A opção PublicSign requer o uso das opções KeyFile ou KeyContainer. As opções KeyFile e KeyContainer especificam a chave pública. As opções PublicSign e DelaySign são mutuamente exclusivas. Às vezes chamado de "sinal falso" ou "sinal de OSS", a assinatura pública inclui a chave pública em um assembly de saída e define o sinalizador "assinado". A assinatura pública não assina o assembly com uma chave privada. Os desenvolvedores usam o sinal público para projetos de código aberto. As pessoas criam assemblies compatíveis com os assemblies "totalmente assinados" lançados quando não têm acesso à chave privada usada para assinar os assemblies. Como poucos consumidor precisa realmente verificar se o assembly está totalmente assinado, esses assemblies criados publicamente podem ser usados em quase todos os cenários nos quais o assembly totalmente assinado seria usado.

DelaySign

Essa opção faz com que o compilador reserve espaço no arquivo de saída para que uma assinatura digital possa ser adicionada mais tarde.

<DelaySign>true</DelaySign>

Use DelaySign- se você quiser um assembly totalmente assinado. Use DelaySign se você quiser apenas colocar a chave pública no assembly. A opção DelaySign não tem nenhum efeito a menos que seja usada com KeyFile ou KeyContainer. As opções KeyContainer e PublicSign são mutuamente exclusivas. Quando você solicita um assembly totalmente assinado, o compilador usa o hash no arquivo que contém o manifesto (metadados de assembly) e sinaliza esse hash com a chave particular. Essa operação cria uma assinatura digital que é armazenada no arquivo que contém o manifesto. Quando um assembly é assinado com atraso, o compilador não computa e nem armazena a assinatura. Em vez disso, o compilador reserva espaço no arquivo para que a assinatura possa ser adicionada posteriormente.

Usar DelaySign permite que um testador coloque o assembly no cache global. Após o teste, é possível assinar completamente o assembly, colocando a chave particular no assembly com o utilitário Assembly Linker. Para obter mais informações, consulte Criando e usando assemblies de nomes fortes e Atraso na Assinatura de um Assembly.

KeyFile

Especifica o nome de arquivo que contém a chave de criptografia.

<KeyFile>filename</KeyFile>

file é o nome do arquivo que contém a chave de nome forte. Quando esta opção é usada, o compilador insere a chave pública da linha especificada no manifesto do assembly e, em seguida, assina o assembly definitivo com a chave privada. Para gerar um arquivo de chave, digite sn -k file na linha de comando. Se você compilar com -target:module, o nome do arquivo de chave será mantido no módulo e incorporado ao assembly criado quando você compilar um assembly com AddModules. Também é possível passar suas informações de criptografia para o compilador com KeyContainer. Use DelaySign se quiser um assembly parcialmente assinado. Caso KeyFile e KeyContainer sejam especificadas na mesma compilação, o compilador primeiro tentará o contêiner de chaves. Se isso ocorrer, o assembly será assinado com as informações no contêiner de chaves. Se o compilador não localizar o contêiner de chaves, ele tentará o arquivo especificado com KeyFile. Se isso for bem-sucedido, o assembly será assinado com as informações no arquivo de chaves e as informações de chave serão instaladas no contêiner de chave. Na próxima compilação, o contêiner de chaves será válido. Um arquivo de chave pode conter apenas a chave pública. Para obter mais informações, consulte Criando e usando assemblies de nomes fortes e Atraso na Assinatura de um Assembly.

KeyContainer

Especifica o nome do contêiner da chave de criptografia.

<KeyContainer>container</KeyContainer>

container é o nome do contêiner de chaves de nome forte. Quando a opção KeyContainer for usada, o compilador criará um componente compartilhável. O compilador insere uma chave pública do contêiner especificado no manifesto do assembly e assina o assembly final com a chave privada. Para gerar um arquivo de chave, digite sn -k file na linha de comando. sn -i instala o par de chaves no contêiner. Não há suporte para essa opção quando o compilador é executado no CoreCLR. Para assinar um assembly ao compilar no CoreCLR, use a opção KeyFile. Se você compilar com TargetType, o nome do arquivo de chave será mantido no módulo e incorporado no assembly quando você compilar este módulo em um assembly com AddModules. Você também pode especificar essa opção como um atributo personalizado (System.Reflection.AssemblyKeyNameAttribute) no código-fonte de qualquer módulo da Common Intermediate Language (CIL). Também é possível passar suas informações de criptografia para o compilador com KeyFile. Use DelaySign para adicionar a chave pública ao manifesto do assembly, mas assinando o assembly até que ele seja testado. Para obter mais informações, consulte Criando e usando assemblies de nomes fortes e Atraso na Assinatura de um Assembly.

HighEntropyVA

A opção do compilador HighEntropyVA informa ao kernel do Windows se um determinado executável é compatível com ASLR (Address Space Layout Randomization) de alta entropia.

<HighEntropyVA>true</HighEntropyVA>

Essa opção especifica que um executável de 64 bits ou um executável marcado pela opção do compilador PlatformTarget dá suporte a um espaço de endereço virtual de alta entropia. A opção é habilitada por padrão para todas as versões do .NET Standard e do .NET Core e versões do .NET Framework começando com .NET Framework 4.5.

A opção HighEntropyVA permite que as versões compatíveis do kernel do Windows usem níveis mais altos de entropia ao randomizar o layout do espaço de endereço de um processo como parte da ASLR. O uso de níveis mais altos de entropia significa que um número maior de endereços pode ser alocado para regiões de memória como pilhas e heaps. Como resultado, fica mais difícil adivinhar a localização de uma região específica da memória. Quando a opção do compilador HighEntropyVA é especificada, o executável de destino e todos os módulos dos quais ele depende devem ser capazes de manipular valores de ponteiro que sejam maiores que 4 GB (gigabytes) quando eles estiverem em execução como um processo de 64 bits.