É possível assinar arquivos?

15

Eu brinquei com o openssl para criar uma chave pub / prv, criar uma assinatura de um arquivo e validá-lo. Eu brinquei com Cryptophane (interface do Windows gnupg) e ouvi falar sobre servidores de chaves + brinquei com a assinatura de texto.

No entanto, eu nunca assinei um arquivo morto. Se eu quiser publicar um arquivo (7z, rar ou zip, isso não importa) e gostaria que meus usuários ou software pudessem verificar se esse arquivo foi assinado, como eu faria isso? Obviamente, a chave pública precisaria estar disponível publicamente. Mas adicionar a assinatura ao arquivo é o que me incomoda. Algum software + arquivo permite que eu assine e verifique um arquivo compactado?


fonte
Por que você quer assinar? Você pode apenas criar um hash SHA1 e disponibilizá-lo para seus clientes / usuários verificarem. Isso é suficiente para confirmar que o arquivo não foi violado. Embora seus usuários precisem ter a capacidade de verificar o hash, mas não mais difícil do que verificar uma assinatura.
BJ292
@ BJ292: E como você verifica se o hash não foi adulterado?
User1686
@ grrawity - Não tenho certeza se eu sigo - qual é o sentido de adulterar o hash? Envio um arquivo e o hash - você recria o hash do arquivo e confirma que ele corresponde - isso confirma que o arquivo não foi alterado. Na maioria das circunstâncias, isso é tudo o que as pessoas desejam - confirmação de que o arquivo foi alterado de A a B inalterado. Certamente parece que é isso que o OP está buscando.
BJ292
3
@ BJ292: Você está assumindo que o OP está preocupado apenas com corrupção acidental de dados. Isso não foi afirmado (ou negado) na pergunta, mas o OP está perguntando sobre assinaturas digitais, portanto, assumirei que há uma necessidade de proteção contra modificações intencionais (possivelmente maliciosas) nos dados.
User1686
1
@ BJ292: Os arquivos serão espelhados em outros sites de pessoas. Eu gostaria de assiná-los para que nenhum dos espelhos pode mexer

Respostas:

10

Um método comum é criar uma assinatura desanexada em um .sigarquivo (geralmente uma assinatura PGP usando gpg -b- X.509 é muito incomum) e fornecer os dois arquivos no mesmo local. Por exemplo:

ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-2.0.19.tar.bz2
ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-2.0.19.tar.bz2.sig

Isso pode ser usado com qualquer tipo de arquivo, mas o usuário terá que verificar a assinatura manualmente usando gpg --verify.


Infelizmente, dos atualmente em uso, nenhum formato de arquivo (que eu saiba) tem suporte para assinaturas internas usando PGP ou X.509. (Isso exclui o CAB, que é usado internamente pelo Windows, mas praticamente em nenhum outro lugar, e é bastante complicado de assinar). O WinRAR 4 conseguiu adicionar um registro de "verificação de autenticidade" usando um formato proprietário, mas usa sua licença do WinRAR como a chave de assinatura, que foi quebrada várias vezes. (Atualização: Este recurso foi removido do WinRAR 5 devido à insegurança.)


No Windows (e em breve no Mac OS X), é possível criar um "arquivo de extração automática" - um executável assinado digitalmente que extrai um arquivo de dentro de si - é assim que os instaladores de software no Windows funcionam, por exemplo. No entanto, os SFXs são limitados a um único sistema operacional, portanto, adequados apenas para a distribuição de programas , não documentos ou fotos. (Os programas Java podem ser assinados e são multiplataforma, mas poucos sistemas ainda têm um tempo de execução Java.)

user1686
fonte
2

Os arquivos jar, criados com o Javas jar-tool, são efetivamente arquivos zip, e existe uma ferramenta, o jarsigner, para assiná-los.

Aqui estão alguns links úteis:

Parece um pouco complicado primeiro ("O que eu preciso guardar? O que mais?"), Mas é fácil seguir as etapas para resolvê-lo de maneira simples. Funciona. Então você pode mergulhar mais fundo no assunto.

Usuário desconhecido
fonte
Isso é verdade (os arquivos XPI também são ZIPs assinados de maneira muito semelhante), mas AFAIK, apenas o Java Runtime verifica as assinaturas JAR, e a necessidade de fazer a verificação manual o torna ainda menos prático que o GnuPG.
user1686
Como assim manual verification? Qual é a alternativa? Um autopopup, que se verifica a cada 10 minutos? O sistema operacional deve verificar automaticamente o arquivo na inicialização? Quando um arquivo é recebido - seja de CD, anexo de email, download, ...? Deve ser um plug-in no seu antivírus?
desconhecido usuário
Eu quis dizer a verificação realizada pela ferramenta de extração de arquivo morto antes / durante a extração ou pelo SO / tempo de execução durante a execução do programa. Por exemplo, as .debassinaturas de pacote são verificadas dpkgantes da instalação do pacote, sem que o usuário execute nenhuma ação adicional.
user1686
@ grrawity: applets assinados, compactados em um jar, são verificados antes da execução. Gerar um script shell mínimo, que combine a verificação (jarsigner) com a extração (jar), será trivial.
usuário desconhecido
terceiro link "wiki em assinar os arquivos jar" está quebrado
Jason S
0

Claro, toda vez que você instala um software assinado, está verificando um arquivo assinado. Para criar um, você deve usar as mesmas ferramentas de empacotamento que os desenvolvedores usam. Existem algumas vantagens, facilidade de uso e compatibilidade entre plataformas. Não consigo pensar em uma maneira de criar um arquivo de extração automática assinado entre plataformas.

Para o Windows, crie um arquivo auto-extraível com a ferramenta iexpress e assine-o usando o signtool.exe, conforme descrito aqui . Quando os usuários clicam duas vezes no arquivo, as janelas familiares confirmam o diálogo identificando você como o editor do arquivo.

bbsimonbb
fonte
-1

Você pode assinar arquivos usando o jarsigner com estes dois comandos:

keytool -genkeypair -alias <key-alias> -keyalg RSA -keystore <keystore> -validity 180

jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore <keystore> <file-to-sign> <key-alias>

Você precisa instalar o java jdk no seu pc.

-O primeiro comando cria o armazenamento de chaves no diretório atual (supondo que ele ainda não exista). Ele gera um par de chaves pública / privada usando o algoritmo SHA-256.

-O segundo assina o arquivo usando o mesmo algoritmo, o keystore e o alias gerado pelo primeiro.

Para verificar um arquivo assinado usando um armazenamento de chaves, você pode executar este comando:

jarsigner -keystore <keystore> -verify -verbose -certs <file-signed>
afonte
fonte