O que é um .snk?

153

O que é um arquivo .snk? Eu sei que significa Chave fortemente nomeada , mas todas as explicações sobre o que é e como funciona passam pela minha cabeça.

Existe alguma explicação simples sobre como uma chave com nome forte é usada e como ela funciona?

oɔɯǝɹ
fonte

Respostas:

212

O arquivo .snk é usado para aplicar um nome forte a um assembly .NET . um nome tão forte consiste em

um nome de texto simples, número da versão e informações de cultura (se fornecidas) - além de uma chave pública e uma assinatura digital.

O SNK contém um par de chaves exclusivo - uma chave pública e privada que pode ser usada para garantir que você tenha um nome forte e exclusivo para o assembly. Quando o assembly é fortemente nomeado, um "hash" é construído a partir do conteúdo do assembly e o hash é criptografado com a chave privada. Em seguida, esse hash assinado é colocado no assembly junto com a chave pública do .snk.

Posteriormente, quando alguém precisa verificar a integridade do assembly com nome forte, ele cria um hash do conteúdo do assembly e usa a chave pública do assembly para descriptografar o hash que acompanha o assembly - se os dois hashes corresponderem, a verificação da montagem é aprovada.

É importante poder verificar os assemblies dessa maneira para garantir que ninguém troque um assembly por um malicioso que subverta todo o aplicativo. É por isso que os assemblies com nomes não fortes não são confiáveis ​​da mesma maneira que os assemblies com nomes fortes, para que não possam ser colocados no GAC. Além disso, há uma cadeia de confiança - você não pode gerar um assembly com nome forte que faça referência a assemblies com nome não-forte.

O artigo " The Secrets of Strong Naming" (arquivado na Wayback Machine) ". Faz um excelente trabalho de explicar esses conceitos em mais detalhes. Com fotos.

Blair Conrad
fonte
2
Isso significa que, quando você assina um assembly com um .PFX, ele apenas o usa para gerar um .SNK em tempo real sempre que é compilado?
Patrick
5
@ Patrick não, ou seja, a assinatura Authenticode que, embora também prove que o arquivo não foi modificado entre a assinatura e a verificação, não atende aos requisitos de nome forte. O problema é que o Authenticode não requer uma cadeia de confiança de assemblies que a nomeação forte exige, para que o Authenticode assine um assembly que dependa de assemblies nomeados / assinados não fortes.
Scott Chamberlain
1
Você pode simplesmente retirar a SNK e substituí-la por outra .. eu não sei um cenário real, onde é útil .. é, basicamente, nossos pares de chaves que você não pode construir uma relação de confiança em que
Ibrahim
8
Link do WayBackMachine para Os segredos do nome forte
asfeynman:
Atualize o link na resposta (à sugerida por @asfeynman), pois o link está inoperante e nem todo mundo lê os comentários.
XelaNimed
22

No mundo the.Net, o arquivo SNK é usado para assinar seus binários compilados. Isso permite que algumas coisas aconteçam:

  1. Você pode registrar o assembly no GAC (Global Assembly Cache) . Basicamente, para que você possa referenciá-lo de muitos lugares na mesma máquina sem precisar manter várias cópias).
  2. Você pode usar seus binários de outros binários que também são assinados (esse é um tipo de comportamento viral estranho em relação a assemblies assinados).
  3. Sua montagem não pode (facilmente) ser modificada por terceiros que não têm acesso ao arquivo SNK, fornecendo pelo menos uma pequena quantidade de segurança.

Não estou familiarizado com o funcionamento do servidor BizTalk , por isso acho que não posso esclarecer que finalidade específica eles servem nesse ambiente.

Espero que isso tenha sido útil.

ckramer
fonte
7

O arquivo .snk é usado para assinar os assemblies para poder adicioná-los ao Global Assembly Cache (GAC).

O arquivo .snk contém os tokens públicos e privados da sua chave. Quando você deseja assinar alguns dados (ou binários) com essa chave, uma soma de verificação é calculada nos dados, que são então criptografados com o token privado. A soma de verificação criptografada é então adicionada aos dados. Qualquer pessoa pode usar o token público da sua chave para descriptografar a soma de verificação e compará-la com a soma de verificação calculada para verificar se os dados assinados não foram violados.

Você pode ler mais sobre a criptografia de chave pública em http://en.wikipedia.org/wiki/Public-key_cryptography .

Franci Penov
fonte
4

Um arquivo .snk é uma versão persistente da sua "Chave" produzida pelo utilitário sn no conjunto de utilitários da estrutura. Você então usa esse arquivo para 'assinar digitalmente' seus assemblies. É uma chave de 2 partes. Combinação de chave pública-privada. A parte pública da chave é publicada, isto é, conhecida por todos. A parte privada é conhecida apenas por você, o desenvolvedor do componente / aplicativo e deve ser mantida dessa maneira.

Quando você assina sua montagem, ela usa a chave privada e um valor de hash para criar uma assinatura digital incorporada à sua montagem. Depois disso, qualquer pessoa que carrega sua montagem passa por uma etapa de verificação. A chave pública é usada para validar se o assembly realmente vem de você .. você só precisa da chave pública para isso (que também é incorporada de forma tokenizada no manifesto do assembly). Se a montagem foi violada, o valor do hash seria diferente e a carga da montagem seria abortada. Este é um mecanismo de segurança.

Gishu
fonte
3

Um arquivo .snk é usado para garantir que outra pessoa não possa inserir uma montagem própria no seu lugar. Ele fornece um par de chaves de criptografia / descriptografia.

Quando um arquivo .snk é usado para assinar um assembly, um valor de código de hash é calculado a partir do arquivo do assembly e criptografado usando a chave privada. Esse "resumo" criptografado é anexado ao assembly junto com a chave pública do arquivo .snk.

Então, quando alguém recebe sua montagem, ele também pode calcular esse valor de código de hash. Eles usam a chave pública para descriptografar a que você calculou e comparar os valores calculados. Se a montagem tiver sido alterada, esses valores serão diferentes e o usuário da montagem saberá que a montagem que você possui não é a que você forneceu.

No contexto do BizTalk Server, quem cria os assemblies personalizados usados ​​pela sua solução BizTalk precisará usar um arquivo .snk para assinar o assembly, para que o servidor BizTalk possa carregá-lo no GAC e usá-lo.

Michael Lang
fonte