Qual é o formato resultante de assinar um arquivo com o openssl?

2

Estou usando este comando para assinar um arquivo:

openssl dgst -binary -sha1 -out signedFile.bin -sign file.pem plainText  

Eu quero saber qual formato é a saída deste comando. Meu objetivo é analisar o resultado e extrair o array de hash.

Qual é o formato? Existem ferramentas para analisar o resultado?

    
por jww 27.08.2014 / 19:59

1 resposta

1

IF file.pem contém uma chave privada RSA (em cujo caso esse nome é enganoso) a saída é uma RSA "simples" PKCS # 1 (v1.5) assinatura - um número de N bits onde N é o tamanho do módulo, arredondado, se necessário, o que raramente é porque as pessoas geralmente usam tamanhos de chave como 1024 e 2048, sem nenhum dos metadados normalmente usados com uma assinatura. dgst -sign é padronizado para -binary , então isso é redundante (a forma somente hash de dgst não) mas como @ zedman9991 diz que você pode pedir -hex .

Mas não faz sentido analisar isso. É um número. Se você quiser "recuperar" o valor de hash assinado, que PKCS # 1 suporta, mas outros formatos RSA não podem e outros algoritmos como DSA e ECDSA definitivamente não, você precisa (1) fazer um cálculo de modexp-e (incorretamente chamado "descriptografar com a chave pública"), em seguida, (2) unpad, então (3) ASN.1 decodificar. "parse" pode ser razoavelmente usado para significar (2) ou (3) ou ambos. Você pode escrever um programa em C para fazer isso em talvez 20 linhas. Dado o arquivo binário, rsautl -verify faz (1) e (2) (dado v1.5 preenchimento que é o dgst -sign padrão) e você pode fazer (3) manualmente ou com asn1parse :

c:\work>echo test >in & od -tx1 in
0000000 74 65 73 74 20 20 0d 0a
0000010

c:\work>openssl dgst -sha1 -hex in
SHA1(in)= a02bfe060e0d7857137b7082124541237ed740c7

c:\work>openssl dgst -sha1 -sign rsakey.pem in >sig & od -tx1 sig
0000000 53 e3 68 70 69 d9 fd 1f b1 83 6e eb 1c 6f 58 ab
0000020 b5 44 88 3f d2 67 19 21 9b 95 39 bb ce 2d 7c ac
0000040 51 03 c3 a5 61 7e 47 f6 4b e1 c0 4a 74 ee 7f 29
0000060 b2 cc ff 91 20 97 c4 f9 2e 3e 9f 61 06 62 e3 fe
0000100 ea 4c 3f a6 3b da b4 03 62 81 a7 8c 91 b7 d5 49
0000120 8c d1 e9 92 ff 4b 97 c0 b5 74 59 4d 19 e1 57 c9
0000140 a8 98 f4 c8 df 70 b4 89 57 b0 24 f5 b0 a9 69 b4
0000160 dd ed a0 26 73 bd ca ad a0 f9 e2 0e ea fe 39 8d

c:\work>openssl rsautl -verify -inkey rsakey.pem <sig >rec & od -tx1 rec
Loading 'screen' into random state - done
0000000 30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 a0
0000020 2b fe 06 0e 0d 78 57 13 7b 70 82 12 45 41 23 7e
0000040 d7 40 c7
0000043

c:\work>openssl asn1parse -inform der <rec
    0:d=0  hl=2 l=  33 cons: SEQUENCE
    2:d=1  hl=2 l=   9 cons: SEQUENCE
    4:d=2  hl=2 l=   5 prim: OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim: NULL
   13:d=1  hl=2 l=  20 prim: OCTET STRING      [HEX DUMP]:A02BFE060E0D7857137B7082124541237ED740C7

O valor do último campo (OCTET STRING) da assinatura "recuperada" DER, que também é seus últimos 20 octetos neste caso, é o valor de hash.

(Para um exemplo simples, usei uma chave RSA de 1024 bits e, portanto, uma assinatura de 128 bytes. Agora, o RSA-1024 é considerado com algum risco de ser quebrado em um futuro previsível, então pelo menos 1536 e geralmente 2048 ou mais geralmente é necessário para aplicativos seguros.)

    
por 28.08.2014 / 14:40

Tags