'공개 키 토큰'이란 무엇이며 어셈블리에서 강력한 이름을 어떻게 계산합니까?공개 키 토큰이란 무엇이며 어셈블리에서 강력한 이름으로 계산되는 방식은 무엇입니까?
답변
"어떻게 계산 되는가?"라는 질문에 대해서는 SHA1 해시입니다. dot net blog에서
:
Microsoft는 강력한 이름의 어셈블리의 공개 키의 해시를 사용하여 "공개 키 부풀게"문제를 해결합니다. 이 해시는 공개 키 토큰이라고하며, 어셈블리의 공개 키의 SHA1 해시 인 의 하위 8 바이트입니다. SHA1 해시는 160 비트 (20 바이트) 해시이고이 해시의 상위 12 바이트는이 알고리즘에서 단순히 으로 삭제됩니다.
ECMA-335에서
어셈블리에 서명하는 데 사용되는 키의 해시 바이트입니다.
따라서 키에 대해 수백 자리의 16 진수를 나열하는 대신 충돌이 거의없는 간단한 방법이 있습니다.
사실은 꼬리가 아니라 열쇠의 해시입니다. 바이트. 실제 키는 수백 개가 아니라 수십 바이트입니다. –
고정 해시 (감사). 기본 키는 1024 또는 512 비트입니다. 256 또는 128 16 진수가 필요합니다 (이는 단지 :-)) 수백입니다. – Richard
공개 키 토큰은 강력한 이름의 어셈블리에서 조직을 식별하는 데 사용됩니다. 이 정보는 어셈블리 메타베이스에 추가됩니다. 나는 리차드가 그것이 저장된 기술적 인 방법에 대해 정확하다고 가정 할 것이다.
어셈블리의 메타베이스를 보려면 ILDASM을 사용하십시오. IL을 보는 것 외에도 메타베이스에 저장된 내용을 드릴 다운 할 수 있습니다.
:이 선언은 오히려 전체 공개 키보다, 어셈블리 참조에 발신자의 공개 키의 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
당신이 전체 공개 키 기반의 공개 키 토큰을 생성해야하는 경우는,이 작은 정적 방법은 작동합니다
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;
}
당신은 입력하여 VS 명령 줄에서 PublicKeyToken를 얻을 수 있습니다 :
sn –T DLLName.dll
+1, (더 최신의) 구문은'sn -q -T DLLName.dll'입니다. –
- 1. spnego 토큰이란 무엇입니까?
- 2. .NET 어셈블리에서 공개 키 토큰을 사용하여 제품을 손상시키는 가장 좋은 방법은 무엇입니까?
- 3. 공개 키 인프라 란 무엇입니까
- 4. Windows 7의 강력한 이름 키
- 5. .Net 클라이언트에서 원격 파일을 복사하거나 이동하는 강력한 접근 방식은 무엇입니까?
- 6. VB.NET 어셈블리에서 강력한 이름 유효성 검사가 실패했습니다.
- 7. 공개/개인 키 재사용
- 8. 마켓 플레이스 - 공개 키
- 9. 공개 키 인증서
- 10. 배포 공개 키
- 11. 키 이름으로 데이터베이스 잠그기
- 12. 어셈블리에 강력한 이름을 지정할 때 : 키 쌍 또는 공개 키를 선택하는 데 사용할 키는 무엇입니까?
- 13. 공개 키 알고리즘의 속도가 느린 이유는 무엇입니까?
- 14. Ninject ConstructorArguments를 강력한 이름으로 사용할 수 있습니까?
- 15. mongoDB에서 키 이름으로 값을 검색하는 방법은 무엇입니까?
- 16. 키 컨테이너에서 강력한 이름 내보내기
- 17. .snk 파일에서 공개 키를 게시해야합니까?
- 18. 암호화 제품 키 : 공개 키 및 개인 키 암호화
- 19. 정확히 왜 regasm은 강력한 이름으로 서명하는 것에 대해 경고합니까?
- 20. 공개 키 인증은 어떻게 설정합니까?
- 21. 공개 키 암호화는 어떻게 작동합니까?
- 22. 반대로 공개/비공개 키 사용하기
- 23. SSHJ 공개 키 인증의 예
- 24. 공개 키 암호화 작동 방법
- 25. 전자 서명으로 공개 키 받기
- 26. 브라우저에 내장 된 공개 키
- 27. AWS 공개 키 거부 문제
- 28. 공개 키 암호화에 대한 질문
- 29. DataReader의 작동 방식은 무엇입니까?
- 30. MonoTouch의 작동 방식은 무엇입니까?
도 참조에 http : // stackoverf를 low.com/q/1321419/284795 –
공개 키는 개인 키 (어셈블리에 서명하는 데 사용됨)에 해당하는 키입니다. [Strong-Named Assemblies] (https://msdn.microsoft.com/en-us/library/wd40t7ad(v=vs.110).aspx) – Lu55