Udostępnij za pośrednictwem


Opcje kompilatora języka C# dla zabezpieczeń

Poniższe opcje kontrolują opcje zabezpieczeń kompilatora. Nowa składnia programu MSBuild jest wyświetlana w obszarze Pogrubienie. Starsza składnia csc.exe jest wyświetlana w pliku code style.

  • PublicSign / -publicsign: publicznie podpisz zestaw.
  • DelaySign / -delaysign: opóźnij podpisywanie zestawu przy użyciu tylko publicznej części klucza silnej nazwy.
  • KeyFile / -keyfile : określ plik klucza silnej nazwy.
  • KeyContainer / -keycontainer: określ kontener klucza silnej nazwy.
  • HighEntropyVA / -highentropyva: włącz losowe układy przestrzeni adresowej o wysokiej entropii (ASLR)

PublicSign

Ta opcja powoduje, że kompilator stosuje klucz publiczny, ale w rzeczywistości nie podpisuje zestawu. Opcja PublicSign ustawia również nieco w zestawie, który informuje środowisko uruchomieniowe, że plik jest podpisany.

<PublicSign>true</PublicSign>

Opcja PublicSign wymaga użycia opcji KeyFile lub KeyContainer. Opcje KeyFile i KeyContainer określają klucz publiczny. Opcje PublicSign i DelaySign wzajemnie się wykluczają. Czasami nazywane "fałszywym znakiem" lub "znakiem systemu operacyjnego", podpisywanie publiczne zawiera klucz publiczny w zestawie wyjściowym i ustawia flagę "podpisany". Podpisywanie publiczne nie podpisuje zestawu przy użyciu klucza prywatnego. Deweloperzy używają podpisywania publicznego dla projektów open source. Osoby tworzą zestawy zgodne z wydanymi zestawami "w pełni podpisanymi", gdy nie mają dostępu do klucza prywatnego używanego do podpisywania zestawów. Ponieważ niewielu konsumentów rzeczywiście musi sprawdzić, czy zestaw jest w pełni podpisany, te publicznie utworzone zestawy są używane w prawie każdym scenariuszu, w którym będzie używany w pełni podpisany.

DelaySign

Ta opcja powoduje, że kompilator zarezerwował miejsce w pliku wyjściowym, aby można było dodać podpis cyfrowy później.

<DelaySign>true</DelaySign>

Użyj funkcji DelaySign — jeśli chcesz w pełni podpisany zestaw. Użyj funkcji DelaySign , jeśli chcesz umieścić klucz publiczny tylko w zestawie. Opcja DelaySign nie ma wpływu, chyba że jest używana z kluczemFile lub KeyContainer. Opcje KeyContainer i PublicSign wzajemnie się wykluczają. Gdy zażądasz w pełni podpisanego zestawu, kompilator skróty pliku zawierającego manifest (metadane zestawu) i znaki skrótu z kluczem prywatnym. Ta operacja tworzy podpis cyfrowy przechowywany w pliku zawierającym manifest. Gdy zestaw jest podpisany z opóźnieniem, kompilator nie oblicza i nie przechowuje podpisu. Zamiast tego kompilator zastrzega sobie miejsce w pliku, aby można było później dodać podpis.

Użycie funkcji DelaySign umożliwia testerowi umieszczenie zestawu w globalnej pamięci podręcznej. Po przetestowaniu można w pełni podpisać zestaw, umieszczając klucz prywatny w zestawie przy użyciu narzędzia Konsolidator zestawów. Aby uzyskać więcej informacji, zobacz Tworzenie i używanie zestawów o silnych nazwach i opóźnianie podpisywania zestawu.

KeyFile

Określa nazwę pliku zawierającą klucz kryptograficzny.

<KeyFile>filename</KeyFile>

file to nazwa pliku zawierającego silny klucz nazwy. Gdy ta opcja jest używana, kompilator wstawia klucz publiczny z określonego pliku do manifestu zestawu, a następnie podpisuje ostateczny zestaw za pomocą klucza prywatnego. Aby wygenerować plik klucza, wpisz sn -k file polecenie w wierszu polecenia. Jeśli skompilujesz element -target:module, nazwa pliku klucza będzie przechowywana w module i włączona do zestawu utworzonego podczas kompilowania zestawu za pomocą funkcji AddModules. Możesz również przekazać informacje o szyfrowaniu do kompilatora za pomocą narzędzia KeyContainer. Użyj funkcji DelaySign , jeśli chcesz częściowo podpisany zestaw. W przypadku, gdy zarówno KeyFile , jak i KeyContainer są określone w tej samej kompilacji, kompilator najpierw spróbuje kontener kluczy. Jeśli to się powiedzie, zestaw jest podpisany przy użyciu informacji w kontenerze kluczy. Jeśli kompilator nie znajdzie kontenera kluczy, spróbuje wykonać plik określony w pliku KeyFile. Jeśli to się powiedzie, zestaw zostanie podpisany przy użyciu informacji w pliku klucza, a informacje o kluczu zostaną zainstalowane w kontenerze kluczy. W następnej kompilacji kontener kluczy będzie prawidłowy. Plik klucza może zawierać tylko klucz publiczny. Aby uzyskać więcej informacji, zobacz Tworzenie i używanie zestawów o silnych nazwach i opóźnianie podpisywania zestawu.

KeyContainer

Określa nazwę kontenera kluczy kryptograficznych.

<KeyContainer>container</KeyContainer>

container to nazwa kontenera klucza silnej nazwy. Gdy jest używana opcja KeyContainer, kompilator tworzy składnik z możliwością udostępniania. Kompilator wstawia klucz publiczny z określonego kontenera do manifestu zestawu i podpisuje ostateczny zestaw za pomocą klucza prywatnego. Aby wygenerować plik klucza, wpisz sn -k file polecenie w wierszu polecenia. sn -i instaluje parę kluczy w kontenerze. Ta opcja nie jest obsługiwana, gdy kompilator działa w rdzeniu CoreCLR. Aby podpisać zestaw podczas kompilowania w coreCLR, użyj opcji KeyFile . Jeśli skompilujesz element TargetType, nazwa pliku klucza będzie przechowywana w module i włączona do zestawu podczas kompilowania tego modułu do zestawu za pomocą funkcji AddModules. Tę opcję można również określić jako atrybut niestandardowy (System.Reflection.AssemblyKeyNameAttribute) w kodzie źródłowym dla dowolnego modułu wspólnego języka pośredniego (CIL). Możesz również przekazać informacje o szyfrowaniu do kompilatora za pomocą pliku KeyFile. Użyj funkcji DelaySign , aby dodać klucz publiczny do manifestu zestawu, ale podpisywanie zestawu do momentu jego przetestowania. Aby uzyskać więcej informacji, zobacz Tworzenie i używanie zestawów o silnych nazwach i opóźnianie podpisywania zestawu.

HighEntropyVA

Opcja kompilatora HighEntropyVA informuje jądro systemu Windows, czy określony plik wykonywalny obsługuje losowe układy przestrzeni adresowej o wysokiej entropii (ASLR).

<HighEntropyVA>true</HighEntropyVA>

Ta opcja określa, że 64-bitowy plik wykonywalny lub plik wykonywalny oznaczony opcją kompilatora PlatformTarget obsługuje przestrzeń adresową wirtualną o wysokiej entropii. Opcja jest domyślnie włączona dla wszystkich wersji .NET Standard i .NET Core oraz .NET Framework, począwszy od programu .NET Framework 4.5.

Opcja HighEntropyVA umożliwia zgodne wersje jądra systemu Windows do korzystania z wyższych stopni entropii podczas losowania układu przestrzeni adresowej procesu w ramach ASLR. Użycie wyższych stopni entropii oznacza, że można przydzielić większą liczbę adresów do regionów pamięci, takich jak stosy i stertki. W związku z tym trudniej jest odgadnąć lokalizację określonego regionu pamięci. Opcja kompilatora HighEntropyVA wymaga docelowego pliku wykonywalnego i wszystkich modułów, od których zależy, może obsługiwać wartości wskaźnika większe niż 4 gigabajty (GB), gdy są uruchomione jako proces 64-bitowy.