Options du compilateur C# pour la sécurité

Les options suivantes contrôlent les options de sécurité du compilateur. La nouvelle syntaxe MSBuild est affichée en gras. La syntaxe csc.exe plus ancienne est présentée en code style.

  • PublicSign / -publicsign : signez publiquement l’assembly.
  • DelaySign / -delaysign : différez la signature de l'assembly en utilisant uniquement la partie publique de la clé de nom fort.
  • KeyFile / -keyfile : spécifiez un fichier de clé de nom fort.
  • KeyContainer / -keycontainer : spécifiez un conteneur de clé de nom fort.
  • HighEntropyVA / -highentropyva : activez la randomisation du layout de l’espace d’adressage haute entropie (ASLR)

PublicSign

Cette option force le compilateur à appliquer une clé publique sans signer l’assembly. L’option PublicSign définit également un bit dans l’assembly qui indique au runtime que le fichier est signé.

<PublicSign>true</PublicSign>

L’option PublicSign nécessite l’utilisation de l’option KeyFile ou KeyContainer. Les options KeyFile ou KeyContainer spécifient la clé publique. Les options PublicSign et DelaySign s’excluent mutuellement. Parfois appelé « faux signe » ou « signature OSS », la signature publique comprend la clé publique dans un assembly de sortie et définit l’indicateur « signé ». La signature publique ne signe pas réellement l’assembly avec une clé privée. Les développeurs utilisent la signature publique pour les projets open source. Les personnes créent des assemblys qui sont compatibles avec les assemblys « entièrement signés » publiés lorsqu’ils n’ont pas accès à la clé privée utilisée pour signer les assemblys. Puisque peu de consommateurs doivent vérifier si l’assembly est totalement signé, ces assemblys générés publiquement peuvent être utilisés dans la quasi-totalité des scénarios employant des assemblys totalement signés.

DelaySign

Cette option fait en sorte que le compilateur réserve de l’espace dans le fichier de sortie afin qu’une signature numérique puisse être ajoutée ultérieurement.

<DelaySign>true</DelaySign>

Utilisez DelaySign- si vous souhaitez obtenir un assembly complètement signé. Utilisez DelaySign si vous souhaitez uniquement placer la clé publique dans l’assembly. L’option DelaySign est sans effet sauf si elle est utilisée avec KeyFile ou KeyContainer. Les options KeyContainer et PublicSign s’excluent mutuellement. Quand vous demandez un assembly totalement signé, le compilateur hache le fichier qui contient le manifeste (métadonnées de l’assembly) et signe ce hachage avec la clé privée. L’opération crée une signature numérique qui est stockée dans le fichier contenant le manifeste. Lorsqu’un assembly est signé en différé, le compilateur ne calcule pas et ne stocke pas la signature. Au lieu de cela, le compilateur réserve de l’espace dans le fichier pour que la signature puisse être ajoutée ultérieurement.

Par exemple, l’utilisation de DelaySign permet à un testeur de placer l’assembly dans le cache global. Après un test, vous pouvez signer complètement l’assembly en plaçant la clé privée dans l’assembly à l’aide de l’utilitaire Assembly Linker. Pour plus d’informations, consultez Création et utilisation d’assemblys avec nom fort et Différer la signature d’un assembly.

KeyFile

Spécifie le nom du fichier contenant la clé de chiffrement.

<KeyFile>filename</KeyFile>

file est le nom du fichier contenant la clé de nom fort. Quand cette option est utilisée, le compilateur insère la clé publique du fichier spécifié dans le manifeste d'assembly, puis signe l'assembly final avec la clé privée. Pour générer un fichier de clé, tapez sn -k file à la ligne de commande. Si vous compilez avec -target:module, le nom du fichier de clé est conservé dans le module et incorporé dans l’assembly créé quand vous compilez un assembly avec AddModules. Vous pouvez également passer vos informations de chiffrement au compilateur avec KeyContainer. Utilisez -DelaySign si vous voulez obtenir un assembly partiellement signé. Si KeyFile et KeyContainer sont spécifiés dans la même compilation, le compilateur essaie d’abord d’utiliser le conteneur de clé. Si cette tentative réussit, l'assembly est signé avec les informations figurant dans le conteneur de clé. Si le compilateur ne trouve pas le conteneur de clé, il essaie d’utiliser le fichier spécifié avec KeyFile. En cas de tentative, l’assembly est signé avec les informations contenues dans le fichier de clé et les informations sur la clé sont installées dans le conteneur de clé. Lors de la compilation suivante, le conteneur de clé sera valide. Un fichier de clé peut contenir uniquement la clé publique. Pour plus d’informations, consultez Création et utilisation d’assemblys avec nom fort et Différer la signature d’un assembly.

KeyContainer

Spécifie le nom du conteneur de la clé de chiffrement.

<KeyContainer>container</KeyContainer>

container est le nom du conteneur de clé de nom fort. Quand l’option KeyContainer est utilisée, le compilateur crée un composant pouvant être partagé. Le compilateur insère une clé publique à partir du conteneur spécifié dans le manifeste d’assembly et signe l’assembly final avec la clé privée. Pour générer un fichier de clé, tapez sn -k file à la ligne de commande. sn -i installe la paire de clés dans un conteneur. Cette option n’est pas prise en charge quand le compilateur s’exécute sur CoreCLR. Pour signer un assembly en cas de génération sur CoreCLR, utilisez l’option KeyFile. Si vous compilez avec TargetType, le nom du fichier de clé est conservé dans le module et incorporé dans l’assembly quand vous compilez ce module dans un assembly avec AddModules. Vous pouvez également spécifier cette option en tant qu’attribut personnalisé (System.Reflection.AssemblyKeyNameAttribute) dans le code source de tout module CIL (Common Intermediate Language). Vous pouvez également passer vos informations de chiffrement au compilateur avec KeyFile. Utilisez DelaySign pour ajouter la clé publique au manifeste d’assembly, mais différer la signature de l’assembly tant qu’il n’a pas été testé. Pour plus d’informations, consultez Création et utilisation d’assemblys avec nom fort et Différer la signature d’un assembly.

HighEntropyVA

L’option de compilateur HighEntropyVA indique au noyau Windows si un fichier exécutable particulier prend en charge la randomisation du layout de l’espace d’adressage (ASLR) de forte entropie.

<HighEntropyVA>true</HighEntropyVA>

Cette option spécifie qu’un exécutable 64 bits ou un exécutable marqué par l’option du compilateur PlatformTarget prend en charge un espace d’adressage virtuel d’entropie élevée. L’option est activée par défaut pour toutes les versions de .NET Standard et .NET Core, ainsi que pour les versions de .NET Framework à compter de .NET Framework 4.5.

L’option HighEntropyVA permet à des versions compatibles du noyau Windows d’utiliser un degré d’entropie plus élevé lors de la randomisation du layout de l’espace d’adressage d’un processus. En utilisant un degré d’entropie plus élevé, vous pouvez allouer un plus grand nombre d’adresses aux zones de mémoire, telles que les piles et les tas. Par conséquent, il est plus difficile de deviner l’emplacement d’une zone de mémoire. L’option du compilateur HighEntropyVA nécessite que l’exécutable cible et tous les modules dont il dépend puissent être capables de gérer les valeurs de pointeur supérieures à 4 Go lorsqu’ils sont exécutés en tant que processus 64 bits.