[C#] C # : 왜 어셈블리에 서명합니까?

Visual Studio 2005에서 가져온 일부 C # 코드에서 어셈블리가 모두 같은 .snk파일로 서명되어 있음을 알았습니다 .

  • 이전 저자가 왜 이런 방식으로 어셈블리에 서명했을까요?
  • 서명 어셈블리가 필요하고 서명하지 않을 경우 무엇이 잘못됩니까?
  • 어셈블리 서명에 어떤 단점이 있습니까? 지연이 발생합니까?


답변

이전 저자가 왜 이런 방식으로 어셈블리에 서명했을까요?

그는 모든 어셈블리에 동일한 키로 서명하기를 원했을 수도 있습니다.

어셈블리에 서명해야하는데 서명하지 않으면 무엇이 잘못됩니까?

필요하지는 않지만 어셈블리의 진위를 보장 할 수있는 메커니즘입니다. 이를 통해 어셈블리가 변경되지 않았으며이 작성자의 어셈블리인지 확인할 수 있습니다. GAC에 넣으려는 경우에도 필요합니다.

어셈블리 서명에 어떤 단점이 있습니까? 지연이 발생합니까?

서명 된 어셈블리는 다른 서명 된 어셈블리 만로드 할 수 있습니다. 또한 특정 버전과 연결되어 있으므로 다른 버전을 사용하려는 경우 바인딩 리디렉션을 사용하거나 응용 프로그램을 다시 컴파일해야합니다. 서명 확인으로 인해 약간의 성능 오버 헤드가 있지만 걱정할 필요가 없습니다.


답변

어셈블리를 GAC 에 넣으려면 어셈블리에 서명해야합니다 .

실행 파일에 서명하면 연결되는 클래스 라이브러리도 서명해야합니다. 당신이 (당신이 사용해야 특히 타사 라이브러리를 사용하는 경우이 어려울 수 있습니다 액티브 X 컨트롤 또는 유사한).

Richard Grimes는 .NET의 보안에 대한 훌륭한 워크샵을 작성했으며 여기에는 다음과 같은 장이 포함되어 있습니다. 보안 워크샵

모든 어셈블리가 동일한 .snk 파일로 서명 된 이유는 코드 범위를 가진 단위 테스트를 사용한 경우 일 수 있습니다. 코드 커버리지를 수행하려면 (적어도 Visual Studio 2005의 테스트 버전에 내장 된 도구를 사용하여) 어셈블리에 서명 한 경우 서명에 사용되는 .snk 파일을 지정해야하지만 전체 솔루션에 대해 하나의 .snk 파일을 지정하십시오. 다른 .snk 파일로 다양한 클래스 라이브러리에 서명하면 한 번에 하나의 코드 범위 만 확인할 수 있습니다.


답변

어셈블리에 서명해야하는 매우 중요한 이유는 어셈블리인지 확인할 수 있기 때문입니다. 개인 키는 본인의 것이기 때문에 아무도 같은 키로 어셈블리에 서명 할 수 없습니다. 즉, 어셈블리의 공개 키가 사용자가 알고있는 키인 경우 ( GetType().Assembly.GetName().GetPublicKey()함수를 사용하여 검색 할 수 있음) 어셈블리가 사용자의 것이며 키 가 변경되지 않았 음을 의미합니다.


답변

dll 서명에 대한 모든 사용법에도 불구하고 dll은 두 가지 이유로 만 서명되어야합니다.

1. 버전 관리

2. 인증

ㅏ. 버전 관리는 dll이 빌드 된 버전을 나타내며 GAC에 푸시하는 동안 동일한 이름의 두 dll이 존재할 수 있지만 다른 버전이 있습니다.

비. 인증은 dll이 변조되지 않았는지 여부를 나타내며 생성시 동일하게 존재합니다.

기본 및 dll 서명에 대한 자세한 내용을 보려면 여기 를 참조 하십시오.


답변

기존 답변 외에도 DLL이 타사 소프트웨어에서 동적으로로드되고 소비 될 때 서명 을 사용해야한다고 덧붙입니다. 기술 요구 사항 자체는 아니지만 타사 소프트웨어 제작자가 이러한 정책으로 인해 보안 문제를 강제하는 것이 합리적이므로 매우 일반적입니다.

어셈블리에 서명해야하는 예 :

  • 다음과 같은 Windows 셸 / Windows 탐색기 확장 개발 : Windows 탐색기의 상황에 맞는 메뉴 확장
  • 프로젝트 / 항목 템플릿 마법사 GUI와 같은 Visual Studio 확장 개발

답변

서명 및 조립이 중요합니다. 해당 PC에만 exe 또는 어셈블리가 설치되어 있는지 확인하십시오.

즉 : 해당 폴더를 복사하여 다른 PC에 넣으면 작동하지 않습니다. 해당 시스템에만 해당 어셈블리에 사인 인하기 때문입니다.


답변