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


146

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

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

답변:


186

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

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

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

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

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

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


2
GAC에 배치되면 .NET 2.0 이후로 서명 확인이 더 이상 발생하지 않습니다. GAC에 추가 할 때 한 번만 발생합니다 .
Abel

1
요즘 서명에 대해 어떻게 생각하십니까? 웹 기반 시스템에서? 내가 맞다면 설치된 소프트웨어에 대해 이야기 할 때만 필요했습니다. TFS를 사용하여 Azure에 앱을 게시하면 변조되지 않은 것입니다. 아니면 보안 부분이 누락 되었습니까?
Rick Wolff

첫 번째 질문 : 조립품 서명 키 파일이있는 프로젝트에서 프로젝트 템플릿을 만든 다음 해당 프로젝트 템플릿을 사용하여 다른 항목을 만들고 키 파일을 바꾸는 것을 잊었습니다. ( "he"를 "me"로 바꾸면 오늘 아침에 무엇을했는지 알 수 있습니다.) 따라서 우연입니다.
hardyVeles 2016 년

33

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

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

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

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


17

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


1

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

1. 버전 관리

2. 인증

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

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

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


1
요즘 서명에 대해 어떻게 생각하십니까? 웹 기반 시스템에서? 내가 맞다면 설치된 소프트웨어에 대해 이야기 할 때만 필요했습니다. TFS를 사용하여 Azure에 앱을 게시하면 변조되지 않은 것입니다. 아니면 보안 부분이 누락 되었습니까?
Rick Wolff

1
우리가 며칠 동안 dll에 서명 해야하는 이유를 알 수 없습니다. 이는 Azure에서 Paas 솔루션으로 배포됩니다. 그러나 iaas 솔루션을 사용하는 경우 동일한 iis에서 웹 응용 프로그램으로 dll을 재사용 할 수 있습니다. 내가 추천하지 않는 것. 우리는 GAC (microservice architecture)의 dll을 사용하는 대신 api url을 통해 호출해야합니다.
Karthikeyan VK

1

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

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

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

0

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.