Skip to content

AddressForAll integrity conventions

Peter edited this page Sep 1, 2020 · 5 revisions

Ficou decidido entre Peter e Igor que a melhor opção por hora, tendo em vista a decisão de cartórios brasileiros, em particular a Uniproof, que os padrões de integridade do AddressForAll serão baseados no SHA256. Como a verificação de integridade é sempre feita em meio digital (não se soletra nem se transcreve manualmente uma SHA256), convencionamos que é preferível o uso da representação em base64 conforme RFC 4648 de 2006 e normas Web de expressão da integridade, W3C SRI de 2016.

Cálculo do digist SHA256 de um arquivo

A a Linux terminal, the integrity can be calculated with the following command line. It calculate the digest with a sha256 and apply the base64 algorithm above, for myFile integrity:

openssl dgst -sha256 -binary myFile.ext | openssl base64 -A
# for hexadecimal only `openssl dgst -sha256 myFile.ext`

where:

  • openssl is Openssl
  • dgst means Cryptography - Message Digest (checksum|hash)
  • sha is the hash function: sha256 means Function - SHA256 (Secure Hash Algorithm-256)
  • base64 means Base64

You can also use xxd (comes with vim) to decode the hex, before passing it to base64:

(echo 0:; echo -n foo | sha256sum) | xxd -rp -l 16 | base64 

PS: cuidado, o sinal de igual = no final da hash é o esquema de preenchimento de casas vazias na base64, portanto deve ser mantido.

Justificativas para não ser double

O principal justificativa para o uso do "double" nos cartórios e no Bitcoin foi a garantia de sigilo. No Instituto AddressForAll, que prima pela transparência, todas as certificações são relativas a documentos públicos, de modo que até mesmo o tamanho do arquivo é incluso como metadado, não é segredo. Tendo isso em vista, são três motivos técnicos importantes que justificam a preferência pelo "hash puro" em detrimento do "double":

  1. Sem tenho um digest SHA256 sempre posso aferir a partir dele o seu double (ver script de terminal abaixo). O inverso não, portanto é preferível preservar a informação original.

  2. O "double" é criptograficamente redundante, representando portanto apenas um gasto inútil de CPU.

  3. Com o double não será reconhecido por qualquer navegador, ver por exemplo https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity

openssl dgst -sha256 <( printf "Hello World!" ) |  awk '{print $2}' > myHashHex
xxd -r -p myHashHex | openssl dgst -sha256 
openssl dgst -sha256 -binary <( printf "Hello World!" ) | openssl dgst -sha256
# both must be 61f417374f4400b47dcae1a8f402d4f4dacf455a0442a06aa455a447b0d4e170

Exemplos ilustrativos

... ver http://addressforall.org/estatuto