-
Notifications
You must be signed in to change notification settings - Fork 0
AddressForAll integrity conventions
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.
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:
-
opensslis Openssl -
dgstmeans Cryptography - Message Digest (checksum|hash) -
sha is the hash function:
sha256means Function - SHA256 (Secure Hash Algorithm-256) -
base64means 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.
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":
-
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.
-
O "double" é criptograficamente redundante, representando portanto apenas um gasto inútil de CPU.
-
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