2009-02-21 4 views
23

'공개 키 토큰'이란 무엇이며 어셈블리에서 강력한 이름을 어떻게 계산합니까?공개 키 토큰이란 무엇이며 어셈블리에서 강력한 이름으로 계산되는 방식은 무엇입니까?

+0

도 참조에 http : // stackoverf를 low.com/q/1321419/284795 –

+0

공개 키는 개인 키 (어셈블리에 서명하는 데 사용됨)에 해당하는 키입니다. [Strong-Named Assemblies] (https://msdn.microsoft.com/en-us/library/wd40t7ad(v=vs.110).aspx) – Lu55

답변

16

"어떻게 계산 되는가?"라는 질문에 대해서는 SHA1 해시입니다. dot net blog에서

:

Microsoft는 강력한 이름의 어셈블리의 공개 키의 해시를 사용하여 "공개 키 부풀게"문제를 해결합니다. 이 해시는 공개 키 토큰이라고하며, 어셈블리의 공개 키의 SHA1 해시 인 의 하위 8 바이트입니다. SHA1 해시는 160 비트 (20 바이트) 해시이고이 해시의 상위 12 바이트는이 알고리즘에서 단순히 으로 삭제됩니다.

ECMA-335에서
0

어셈블리에 서명하는 데 사용되는 키의 해시 바이트입니다.

따라서 키에 대해 수백 자리의 16 진수를 나열하는 대신 충돌이 거의없는 간단한 방법이 있습니다.

+0

사실은 꼬리가 아니라 열쇠의 해시입니다. 바이트. 실제 키는 수백 개가 아니라 수십 바이트입니다. –

+0

고정 해시 (감사). 기본 키는 1024 또는 512 비트입니다. 256 또는 128 16 진수가 필요합니다 (이는 단지 :-)) 수백입니다. – Richard

3

공개 키 토큰은 강력한 이름의 어셈블리에서 조직을 식별하는 데 사용됩니다. 이 정보는 어셈블리 메타베이스에 추가됩니다. 나는 리차드가 그것이 저장된 기술적 인 방법에 대해 정확하다고 가정 할 것이다.

어셈블리의 메타베이스를 보려면 ILDASM을 사용하십시오. IL을 보는 것 외에도 메타베이스에 저장된 내용을 드릴 다운 할 수 있습니다.

4

:이 선언은 오히려 전체 공개 키보다, 어셈블리 참조에 발신자의 공개 키의 SHA-1 해시의 하위 8 바이트를 저장하는 데 사용됩니다

.
어셈블리 참조는 전체 공개 키 또는 8 바이트 "공개 키 토큰"을 저장할 수 있습니다. 은 컴파일시 어셈블리 서명에 사용 된 것과 동일한 개인 키도 에서 사용 된 어셈블리에 서명했는지 확인하는 데 사용할 수 있습니다. 실행 시간. 어느 쪽도 존재할 필요는 없으며 두 가지 모두 저장할 수는 있지만 유용하지는 않습니다.

[이유 : 어셈블리 참조에 저장된 공개 키 또는 공개 키 토큰은 어셈블리가 참조되고 실제로 런타임에 사용 된 어셈블리가 동일한 개인 키가있는 개체를 소유하고 있고, 따라서 동일한 목적으로 의도 된 것으로 간주 될 수 있습니다. 전체 공개 키는 암호로 안전하지만 참조에 더 많은 저장 공간이 필요합니다. 공용 키 토큰을 사용하면 참조를 저장하는 데 필요한 공간이 줄어들어 유효성 검사 프로세스가 약간 약화됩니다. 끝의 이론적 근거] 해시 계산 방법에 관해서는

같은 사양에서, (나는이 공개 키 토큰이 "계산"하지 않기 때문에 당신이 요구하는지 무엇을 할 수 가정) :

CLI 메타 데이터를 사용하면 어셈블리 생성자가 SHA-1 해시 함수를 사용하여 해당 어셈블리의 암호화 해시를 계산 한 다음 RSA 알고리즘 (파티션 I 참조)과 공개/전용 키 쌍을 사용하여 암호화 할 수 있습니다 생산자가 선택한 이 결과 ("SHA-1/RSA 디지털 서명")는 RSA 알고리즘에 필요한 키 쌍의 공용 부분과 함께 메타 데이터 (§25.3.3)에 에 저장 될 수 있습니다. .publickey 지시문은 서명을 계산하는 데 사용 된 공개 키를 지정하는 데 사용됩니다. 해시를 계산하려면 서명이 0으로 계산되고 해시가 계산 된 다음 결과가 서명에 저장됩니다.

강력한 이름 (SN) 서명 프로세스는 강력한 이름 서명에 표준 해시 및 암호 알고리즘을 사용합니다. PE 파일의 대부분에 대해 SHA-1 해시가 생성됩니다. 해시 값은 SN 개인 키로 RSA 서명됩니다. 확인 목적의 경우 공개 키는 서명 된 해시 값은 물론 PE 파일에도 저장됩니다.
다음을 제외하고는 PE 파일의 모든 부분이 해시됩니다. • Authenticode 서명 항목 : PE 파일은 인증 코드로 서명 할 수 있습니다. Authenticode 서명은 PE 헤더 데이터 디렉토리 의 오프셋 128 (§25.2.3.3의 "인증서 테이블")과이 디렉토리 항목에 의해 지정된 범위의 PE 파일 내용에있는 8 바이트 항목에 포함됩니다. [참고 : 준수하는 PE 파일에서이 항목은 0입니다. 마지막 주] • Strong Name Blob : CLI 헤더의 오프셋 32에있는 8 바이트 항목 (§25.3.3의 "StrongNameSignature" ) 및 PE 파일의이 RVA에 포함 된 해시 데이터의 내용. 8 바이트의 항목이 0이면 관련된 강력한 이름 서명이 없습니다. • PE 헤더 체크섬 : PE 헤더 Windows NT 특정 필드의 오프셋 64에있는 4 바이트 항목 (§25.2.3.2의 "파일 체크섬"). [참고 : 준수하는 PE 파일에서이 항목은 0입니다. 당신은 무료로 여기에 사양을 다운로드 할 수 있습니다

엔드 노트] : http://www.ecma-international.org/publications/standards/Ecma-335.htm

6

당신이 전체 공개 키 기반의 공개 키 토큰을 생성해야하는 경우는,이 ​​작은 정적 방법은 작동합니다

private static byte[] GetKeyTokenFromFullKey(byte[] fullKey) 
    { 
     SHA1CryptoServiceProvider csp = new SHA1CryptoServiceProvider(); 
     byte[] hash = csp.ComputeHash(fullKey); 
     byte[] token = new byte[8]; 
     for (int i = 0; i < 8; i++) 
      token[i] = hash[hash.Length - (i+1)]; 

     return token; 
    } 
10

당신은 입력하여 VS 명령 줄에서 PublicKeyToken를 얻을 수 있습니다 :

sn –T DLLName.dll 
+1

+1, (더 최신의) 구문은'sn -q -T DLLName.dll'입니다. –

관련 문제