Hashing refere-se ao conceito de tomar uma quantidade arbitrária de dados de entrada, aplicando-lhe algum algoritmo e gerando um dado de saída de tamanho fixo chamado hash. A entrada pode ser qualquer número de bits que possam representar um único carácter, um ficheiro MP3, todo um romance, uma folha de cálculo do seu histórico bancário, ou mesmo toda a Internet. A questão é que a entrada pode ser infinitamente grande. O algoritmo de hash pode ser escolhido em função das suas necessidades, e existem muitos algoritmos de hash disponíveis publicamente. A questão é que o algoritmo toma a entrada infinita de bits, aplica alguns cálculos a eles e produz um número finito de bits. Por exemplo, 256 bits.
Para que pode este hash ser utilizado?
Uma utilização comum para hashes hoje em dia é nos ficheiros de impressões digitais, também conhecidos como zonas de verificação. Isto significa que um hash é utilizado para verificar que um ficheiro não foi manipulado ou modificado de qualquer forma não pretendida pelo autor. Se o WikiLeaks, por exemplo, publicar um conjunto de ficheiros juntamente com os seus hashes MD5, quem os descarregar pode verificar que são realmente do WikiLeaks calculando o hash MD5 dos ficheiros descarregados, e se o hash não corresponder ao que foi publicado pelo WikiLeaks, então sabe que o ficheiro foi modificado de alguma forma.
Como é que a fechadura de corrente utiliza o hash?
Os eixos são utilizados em cadeias de blocos para representar o estado actual do mundo. A entrada é o estado completo da cadeia de blocos, ou seja, todas as transacções que tiveram lugar até agora, e o hash de saída resultante representa o estado actual da cadeia de blocos. O hash é usado para acordar entre todas as partes que o estado mundial é um no mesmo, mas como é que estes hashes são realmente calculados?
O primeiro hash é calculado para o primeiro bloco ou para o bloco Génesis utilizando as transacções dentro desse bloco. A sequência de transacções iniciais é utilizada para calcular um hash de bloco para o bloco Génesis. Para cada novo bloco que é gerado mais tarde, o hash do bloco anterior é também utilizado, bem como as suas próprias transacções, como entrada para determinar o seu hash de bloco. É assim que se forma uma cadeia de blocos, cada novo haxixe de bloco apontando para o haxixe de bloco que veio antes. Este sistema de hash assegura que nenhuma transacção no histórico pode ser manipulada porque se qualquer parte da transacção mudar, o hash do bloco a que pertence, e quaisquer hashes de blocos subsequentes como resultado. Seria bastante fácil apanhar qualquer manipulação como resultado, uma vez que apenas os hashes podem ser comparados. Isto é óptimo porque todos na cadeia de blocos só precisam de concordar em 256 bits para representar o estado potencialmente infinito da cadeia de blocos. A cadeia de blocos Ethereum é actualmente de dezenas de gigabytes, mas o estado actual da cadeia de blocos, a partir desta gravação, é este hash hexadecimal representando 256 bits.
E as assinaturas digitais?
As assinaturas digitais, como as assinaturas reais, são uma forma de provar que alguém é quem diz ser, excepto que usamos criptografia ou matemática, que são mais seguras do que as assinaturas manuscritas que podem ser facilmente forjadas. Uma assinatura digital é uma forma de provar que uma mensagem veio de uma pessoa específica e de mais ninguém, tal como um hacker.
As assinaturas digitais são utilizadas hoje em dia em toda a Internet. Cada vez que visita um website através do ACTPS, está a utilizar SSL, que utiliza assinaturas digitais para estabelecer confiança entre si e o servidor. Isto significa que quando visita o Facebook.com, o seu browser pode verificar a assinatura digital que vem com o site para verificar se é realmente originária do Facebook e não de algum hacker.
Em sistemas de encriptação assimétrica, os utilizadores geram algo chamado par de chaves, que é uma chave pública e uma chave privada usando um algoritmo conhecido. A chave pública e a chave privada estão associadas uma à outra através de alguma relação matemática. A chave pública destina-se a ser distribuída publicamente para servir como endereço de recepção de mensagens de outros utilizadores, tais como um endereço IP ou um endereço privado. A chave privada deve ser mantida em segredo e é utilizada para assinar digitalmente mensagens enviadas a outros utilizadores. A assinatura é incluída na mensagem para que o destinatário a possa verificar utilizando a chave pública do remetente. Desta forma, o destinatário pode estar certo de que apenas o remetente poderia ter enviado esta mensagem. Gerar um par de chaves é análogo a criar uma conta na cadeia de blocos, mas sem ter de se registar em qualquer lugar. Bastante fixe. Além disso, cada transacção que é executada na cadeia de blocos é assinada digitalmente pelo remetente.
Para juntar tudo isto, não poderia haver uma cadeia de blocos sem o hash e as assinaturas digitais. Hashing proporciona uma forma de todos na cadeia de blocos concordarem com o estado actual do mundo, enquanto que as assinaturas digitais proporcionam uma forma de assegurar que todas as transacções sejam feitas apenas pelos legítimos proprietários. Contamos com estas duas propriedades para assegurar que a cadeia de bloqueio não foi corrompida ou comprometida.