Quanta informação está incluída com uma assinatura GPG?

3

Digamos que você verifique a assinatura de alguém com o GPG:

$ gpg --decrypt statement.txt.sig 
"I am not a crook."
gpg: Signature made 17 Nov 1973 9:31:50 AM CDT using RSA key ID 92861D99
gpg: Good signature from "Richard Nixon <[email protected]>"
gpg:                 aka "[jpeg image of size 19022]"

O arquivo statement.txt.sig obviamente inclui a declaração / dados que são assinados, bem como a chave pública da pessoa que os assinou. No entanto, há muito mais informações incluídas na saída, como o nome completo e o endereço de email, bem como uma imagem JPEG incluída com a chave pública do signatário.

Onde o GPG está obtendo esses dados extras? Ele foi incluído no arquivo statement.txt.sig , ou está olhando para o seu chaveiro e "preenchendo" todos os detalhes extras que você tem no arquivo? pessoa?

    
por IQAndreas 15.09.2014 / 07:55

1 resposta

5

Não, as informações vêm do certificado mantido em seu anel de chave pública (ou baixado de um servidor de chaves). A assinatura contém apenas algumas informações necessárias para encontrar o certificado correto.

Use gpg --list-packets ou pgpdump :

$ echo Foo. > foo.txt
$ gpg --detach-sign foo.txt
$ gpg --list-packets < foo.txt.sig
:signature packet: algo 1, keyid D24F6CB2C1B52632
    version 4, created 1410762670, md5len 0, sigclass 0x00
    digest algo 10, begin of digest 25 58
    hashed subpkt 2 len 4 (sig created 2014-09-15)
    subpkt 16 len 8 (issuer key ID D24F6CB2C1B52632)
    data: [4091 bits]

Uma assinatura separada possui um pacote "assinatura", contendo os algoritmos, o registro de data e hora de assinatura e o ID da chave de 8 bytes do assinante, que é usado para procurar o certificado do assinante no chaveiro. (Se você não tiver nenhuma chave pública com esse keyid, o GnuPG tentará encontrar uma em servidores de chaves públicos.)

(não sei por que tem o ID da chave duas vezes.)

O GnuPG obtém tudo sobre o signatário procurando pelo keyid - tanto a chave pública para verificar a assinatura, como também os campos userid (nome, endereço, foto) usada para descrever o signatário.

Além de: Observe que o seu exemplo tem um pequeno código de 4 bytes, o que é muito ruim, já que houve algumas centenas de colisões curtas, tanto intencionais quanto acidentais. Usar keyid-format long no seu ~ / .gnupg / gnupg.conf faria com que ele exibisse keyides mais longos, embora estes ainda sejam fáceis de colidir intencionalmente, então você deve sempre verificar a impressão digital ao importar uma nova chave.

(Os pacotes de assinatura, no entanto, sempre mantêm um keyID de 8 bytes. Algumas pessoas configuram o GnuPG para colocar a impressão digital em um campo personalizado (notação), mas isso infelizmente não é usado pelo próprio software.)

Voltar para assinaturas. Se você fez gpg --list-packets em uma assinatura regular (inline), verá mais algumas coisas:

:compressed packet: algo=1
:onepass_sig packet: keyid D24F6CB2C1B52632
    version 3, sigclass 0x00, digest 10, pubkey 1, last=1
:literal data packet:
    mode b (62), created 1410762587, name="",
    raw data: 5 bytes
:signature packet: algo 1, keyid D24F6CB2C1B52632
    version 4, created 1410762587, md5len 0, sigclass 0x00
    digest algo 10, begin of digest eb 31
    hashed subpkt 2 len 4 (sig created 2014-09-15)
    subpkt 16 len 8 (issuer key ID D24F6CB2C1B52632)
    data: [4095 bits]

A mensagem assinada atual está no pacote "literal data", geralmente compactado usando DEFLATE ( pgpdump mostraria o algoritmo real sendo usado).

Ele é precedido por um pacote "onepass_sig", cuja única finalidade é fornecer o keyid sem ter que ler até o final da mensagem inteira - assim o GnuPG pode começar a procurar pelo keyid e prosseguir com a verificação da mensagem de uma só vez. (Ao ler de um tubo, por exemplo, cat|gpg , é impossível procurar para frente e para trás; tudo deve ser lido em uma única passagem.)

Se você quiser, você pode fazer isso com a chave do assinante (certificado) também. Basta exportá-lo para um arquivo primeiro:

# gpg --export D24F6CB2C1B52632 | gpg --list-packets
:public key packet:
    version 4, algo 1, created 1256993643, expires 0
    pkey[0]: [4096 bits]
    pkey[1]: [17 bits]
    keyid: D24F6CB2C1B52632
:user ID packet: "Mantas Mikul\xc4\x97nas "
:signature packet: algo 1, keyid D24F6CB2C1B52632
    version 4, created 1256993643, md5len 0, sigclass 0x13
    digest algo 10, begin of digest 5a e2
[many more lines]

Os certificados também consistem em pacotes, começando com uma chave pública, userid's (etiquetas de texto) com uma assinatura própria para cada um (para proteger contra alguém anexando userids falsos ao pubkey), então vários pacotes de subchave pública (novamente com auto-assinaturas).

    
por 15.09.2014 / 08:48