다음을 통해 공유


강력한 이름의 어셈블리 만들기 및 사용

강력한 이름은 어셈블리의 ID(단순 텍스트 이름, 버전 번호 및 문화권 정보(제공된 경우)와 공개 키 및 디지털 서명으로 구성됩니다. 해당 프라이빗 키를 사용하여 어셈블리 파일에서 생성됩니다. 어셈블리 파일에는 어셈블리를 구성하는 모든 파일의 이름과 해시가 포함된 어셈블리 매니페스트가 포함되어 있습니다.

경고

보안을 위해 강력한 이름을 사용하지 마세요. 고유한 ID만 제공합니다.

강력한 이름의 어셈블리는 다른 강력한 이름의 어셈블리의 형식만 사용할 수 있습니다. 그렇지 않으면 강력한 이름의 어셈블리의 무결성이 손상될 것입니다.

비고

.NET Core는 강력한 이름의 어셈블리를 지원하고 .NET Core 라이브러리의 모든 어셈블리는 서명되지만 대부분의 타사 어셈블리에는 강력한 이름이 필요하지 않습니다. 자세한 내용은 GitHub에서 강력한 이름 서명을 참조하세요.

강력한 이름 시나리오

다음 시나리오에서는 강력한 이름으로 어셈블리에 서명하고 나중에 해당 이름으로 참조하는 프로세스를 간략하게 설명합니다.

  1. 어셈블리 A는 다음 방법 중 하나를 사용하여 강력한 이름으로 만들어집니다.

    • Visual Studio와 같은 강력한 이름 만들기를 지원하는 개발 환경 사용

    • 강력한 이름 도구(Sn.exe)를 사용하여 암호화 키 쌍을 만들고 명령줄 컴파일러 또는 어셈블리 링커(Al.exe)를 사용하여 해당 키 쌍을 어셈블리에 할당합니다. Windows SDK는 Sn.exe 및 Al.exe모두 제공합니다.

  2. 개발 환경 또는 도구는 개발자의 프라이빗 키를 사용하여 어셈블리 매니페스트가 포함된 파일의 해시에 서명합니다. 이 디지털 서명은 어셈블리 A의 매니페스트가 포함된 PE(이식 가능한 실행 파일) 파일에 저장됩니다.

  3. 어셈블리 B는 어셈블리 A의 소비자입니다. 어셈블리 B 매니페스트의 참조 섹션에는 어셈블리 A의 공개 키를 나타내는 토큰이 포함되어 있습니다. 토큰은 전체 공개 키의 일부이며, 공간을 절약하기 위해 키 자체가 아니라 사용됩니다.

  4. 공용 언어 런타임은 어셈블리가 전역 어셈블리 캐시에 배치되는 경우 강력한 이름 서명을 확인합니다. 런타임에 강력한 이름으로 바인딩하는 경우 공용 언어 런타임은 어셈블리 B의 매니페스트에 저장된 키를 어셈블리 A의 강력한 이름을 생성하는 데 사용되는 키와 비교합니다. .NET 보안 검사가 통과되고 바인딩이 성공하면 어셈블리 B는 어셈블리 A의 비트가 변조되지 않았으며 이러한 비트가 실제로 어셈블리 A의 개발자로부터 온 것을 보장합니다.

비고

이 시나리오는 신뢰 문제를 해결하지 않습니다. 어셈블리는 강력한 이름 외에도 전체 Microsoft Authenticode 서명을 전달할 수 있습니다. Authenticode 서명에는 트러스트를 설정하는 인증서가 포함됩니다. 강력한 이름은 코드를 이런 식으로 서명할 필요가 없다는 점에 유의해야 합니다. 강력한 이름은 고유한 ID만 제공합니다.

신뢰할 수 있는 어셈블리의 서명 확인 무시

.NET Framework 3.5 서비스 팩 1부터는 어셈블리가 MyComputer 영역에 대한 기본 애플리케이션 도메인과 같은 전체 신뢰 애플리케이션 도메인에 로드될 때 강력한 이름 서명의 유효성이 검사되지 않습니다. 이를 강력한 이름 바이패스 기능이라고 합니다. 완전 신뢰 환경에서는 서명에 관계없이 서명된 완전 신뢰 어셈블리에 대한 StrongNameIdentityPermission 요구가 항상 성공합니다. 강력한 이름 바이패스 기능은 이 상황에서 완전 신뢰 어셈블리의 강력한 이름 서명 확인의 불필요한 오버헤드를 방지하여 어셈블리가 더 빠르게 로드되도록 합니다.

바이패스 기능은 강력한 이름으로 서명되고 다음과 같은 특성을 가진 모든 어셈블리에 적용됩니다.

  • 증명 정보 없이도 StrongName를 완전히 신뢰할 수 있습니다(예: MyComputer 영역 증명 정보를 갖고 있습니다).

  • 완전히 신뢰할 수 있는 에 로드됩니다 AppDomain.

  • 해당 ApplicationBase속성 아래 AppDomain 의 위치에서 로드됩니다.

  • 지연 서명되지 않았습니다.

이 기능은 개별 애플리케이션 또는 컴퓨터에서 사용하지 않도록 설정할 수 있습니다. 방법: 강력한 이름 바이패스 기능을 사용하지 않도록 설정합니다.

제목 Description
방법: 퍼블릭-프라이빗 키 쌍 만들기 어셈블리에 서명하기 위한 암호화 키 쌍을 만드는 방법을 설명합니다.
어떻게 어셈블리에 강력한 이름을 서명하는지 강력한 이름의 어셈블리를 만드는 방법을 설명합니다.
향상된 강력한 이름 지정 .NET Framework 4.5의 강력한 이름에 대한 향상된 기능을 설명합니다.
방법: 강력한 이름의 어셈블리 참조 컴파일 시간이나 런타임에 강력한 이름이 있는 어셈블리에서 형식 또는 리소스를 참조하는 방법을 설명합니다.
방법: 강력한 이름 바이패스 기능 사용 안 함 강력한 이름 서명의 유효성 검사를 무시하는 기능을 사용하지 않도록 설정하는 방법을 설명합니다. 이 기능은 전체 또는 특정 애플리케이션에 대해 사용하지 않도록 설정할 수 있습니다.
어셈블리 만들기 단일 파일 및 다중 파일 어셈블리에 대한 개요를 제공합니다.
Visual Studio에서 어셈블리 서명을 지연하는 방법 어셈블리를 만든 후 강력한 이름으로 어셈블리에 서명하는 방법을 설명합니다.
Sn.exe(강력한 이름 도구) 강력한 이름을 가진 어셈블리를 만드는 데 도움이 되는 .NET Framework에 포함된 도구에 대해 설명합니다. 이 도구는 키 관리, 서명 생성 및 서명 확인을 위한 옵션을 제공합니다.
Al.exe(어셈블리 링커) 모듈 또는 리소스 파일에서 어셈블리 매니페스트가 있는 파일을 생성하는 .NET Framework에 포함된 도구에 대해 설명합니다.