O que é a função Hash e como ele se relaciona com a criptografia?



O que é Hash e Hashing?


Um algoritmo de hashing é uma função computacional que condensa os dados de entrada em um tamanho fixo, cujo resultado é a saída chamada de hash ou valor de hash . Hashes são usados ​​para identificar, comparar ou executar cálculos em arquivos e strings de dados. Normalmente, o programa primeiro calcula um hash e depois compara os valores aos arquivos originais.


Se você não ama fazer em matemática na escola, que é ok, porque enquanto hashing se baseia em alguns bem loucas Alan Turing esque cálculos, um programa de computador faz a toda a matemática para você. Portanto, tudo que você precisa lembrar da aula de matemática são os fundamentos dos expoentes e funções de probabilidade.


Exemplo de hash de blockchain


Um exemplo de hashing é o que funciona como assinatura digital em um software para que fique disponível para download. Para fazer isso, você precisa de um hash do script do programa que deseja baixar. Você também precisa de uma assinatura digital real, que também é hash.


Depois que os dados de entrada são criptografados, o software é criptografado. E uma vez que o software é criptografado, ele pode ser baixado. Portanto, quando alguém baixa um software, o navegador precisa descriptografar o arquivo e verificar os dois valores de hash exclusivos. O navegador então executa a mesma função hash, usando o mesmo algoritmo, e faz o hash do arquivo e da assinatura novamente. Se o navegador produzir com êxito o mesmo valor de hash, ele pode confirmar que a assinatura e o arquivo são autênticos e não foram alterados.


O significado de determinístico em valores de hash


Os valores de hash são determinísticos e respondem aos parâmetros das variáveis ​​fornecidas do algoritmo. Portanto, o motivo pelo qual o hashing é tão importante para criptomoedas é que a mesma sequência nunca será reproduzida com um conjunto de dados diferente como entrada. Isso significa que dois hashes não podem ser iguais.


O hash resultante da entrada de dados é único e irreversível. Por exemplo, uma entrada de “123” sempre terá a mesma saída. Se não o fizesse e surgisse uma saída diferente toda vez que fosse hash, não haveria consistência ou validade para o processo. Isso também significaria que seus programas nunca falariam a mesma linguagem e, portanto, não poderiam executar o código. O hash usado para Bitcoin é um número hexadecimal de 65 dígitos -que explicarei em breve.


Assinaturas digitais


O hash também requer o uso de assinaturas digitais exclusivas. Por exemplo, os certificados SSL (protocolo SSL / TLS) desempenham um papel no que torna possível a transmissão segura de dados de um dispositivo para outro. As assinaturas digitais ligam uma chave a um conjunto de dados. As assinaturas SSL são dados recebidos de autenticação criptografada. Os certificados SSL, portanto, precisam corresponder a uma chave pública específica à transação pretendida - como um cadeado e uma chave.


SSL / TLS usa criptografia assimétrica que torna possível a troca segura de chaves. A segurança dessa transferência depende de duas chaves. Uma chave pública usada para criptografia e uma chave privada para a descriptografia do destinatário. As assinaturas digitais são muito sensíveis e pequenas alterações resultam em uma geração de hash muito diferente.


SHA-256


Atualmente, SHA-256 é a função de hash mais segura. Esta função expressa as combinações ou valores possíveis que resultam dos dados de entrada fornecidos. SHA significa Secure Hashing Function e 256 expressa a quantidade numérica do comprimento de bit fixo. Isso significa que o destino está correto de 256 bits e, conforme mencionado, o Bitcoin usa um valor de hash hexadecimal 65.


Usar a função SHA-256 torna (quase) impossível duplicar um hash. Isso porque há muitas combinações para tentar e processar. Portanto, uma quantidade significativa de trabalho computacional é necessária. Tanto é verdade que os Bitcoins não são mais explorados com computadores pessoais. Atualmente, para mim, você precisa contar com circuitos integrados específicos de aplicativos ou ASICs. Alcançar essa meta tem uma probabilidade de 2 ^ 256. Se você se lembrar de seus expoentes, vai deduzir que essa é uma variável incrivelmente difícil de acertar.


Além disso, usar essa função hash significa que tal hash é intencionalmente impraticável em termos computacionais para reverter. O resultado intencional é que requer um método aleatório ou de força bruta para resolver a entrada.


O caso em questão


Considere o seguinte, se eu tenho 1 dado de seis lados, tenho 1 chance em 6 de rolar 6. No entanto, quanto mais lados meus dados têm (digamos 256 lados), mais minhas chances de rolar 6 diminuem. Isso é 1 em 256, o que ainda é melhor do que suas chances de usar força bruta em um hash de extensão.


Uma taxa de hash é, então, a velocidade com que as operações de hash ocorrem durante o processo de mineração. Se a taxa de hash ficar muito alta e os mineiros resolverem o problema muito rapidamente, isso aumenta o potencial de colisão. Quando isso acontece, a dificuldade do hash precisa ser ajustada de acordo. Por exemplo, atualmente, um Bitcoin é extraído / hash a cada 10 minutos.


Resistência à colisão


Devido à complexidade e sensibilidade do SHA-256, reverter a sequência hash em um esforço para encontrar os dados de entrada originais é basicamente impossível. A dificuldade de atender o SHA-256 significa que esse hash é extremamente seguro porque é “resistente a colisões”. A resistência à colisão expressa a probabilidade de duas redes diferentes resolverem o mesmo hash com a mesma chance de ser minúscula.


Portanto, dadas as possíveis permutações de SHA-256, a probabilidade de uma colisão é desprezível. Abaixo está uma comparação de dois resultados de hash diferentes. O primeiro usa apenas a função hash único (SHA-1), enquanto o segundo usa a função hash duplo (SHA-256). E como você pode ver, a função de hash duplo produz um hash muito mais complicado e, como consequência, é muito mais resistente a colisões.


Árvore Merkle e raízes Merkle


À medida que os blocos são adicionados a uma cadeia de blocos crescente, é necessário recuperar o espaço de armazenamento; este é o papel da Árvore Merkle. Em vez de armazenar toda a transação, apenas a raiz do hash é armazenada (a Raiz Merkle. Isso significa que ainda é possível verificar o blockchain sem classificar todos os dados.


Os processos de verificação são, portanto, simplificados seguindo uma ramificação. A ramificação vincula as transações ao bloco em que foi registrado, mas não a transação completa em si (pois eles ocupam muito espaço). Em vez disso, a verificação é para garantir que o nó da rede anterior aceitou a transação. Isso afirma continuamente sua confiabilidade. E assim os blocos subsequentes são adicionados à cadeia e o valor pode ser negociado.


Como isso é feito? O Merkle Root resume todos os dados nas transações relacionadas e é armazenado no cabeçalho do bloco. Assim como vimos no caso de hashes, se um único detalhe em qualquer uma das transações for alterado, o Merkle Root também será. Usar uma árvore Merkle torna o teste de um para ver se uma transação específica está incluída no conjunto ou não é muito mais eficiente do que passar por todos os blocos da cadeia.


A Criação de Árvores Merkle


Árvores Merkle se originam repetidamente hashing pares de nós até que haja apenas um hash restante. Este hash é o Root Hash ou Merkle Root. Cada nó folha é um hash de dados transacionais e cada nó não folha é um hash de seus hashes anteriores. Árvores Merkle são binárias e, portanto, requerem um número par de nós de folha. Se o número de transações for ímpar, o último hash se tornará uma duplicata uma vez para criar um número par de nós folha.


Vou pegar emprestado um exemplo de Shaan Ray . Aqui estão quatro transações em um bloco: A, B, C e D. Cada uma tem hash. Então, o hash armazenado em cada nó folha, o resultado é Hash A, B, C e D. Pares consecutivos de nós folha são então resumidos em um nó pai. Isso é feito por hash de Hash A e Hash B, resultando em Hash AB, e hash separado de Hash C e Hash D. O resultado disso é Hash CD. Os dois hashes (Hash AB e Hash CD) são então hash novamente para produzir o Hash Root (a Raiz Merkle).


Conclusão e Revisão


Para alguns, as criptomoedas podem parecer efêmeras demais para serem confiáveis, mas a ideia básica de moeda como o Bitcoin se baseia em práticas monetárias típicas de um sistema fiduciário. Na verdade, atualmente, sistemas monetários semelhantes são usados ​​com frequência. Muitas transações e saldos bancários dependem de dados em vez da presença física de moeda forte (como ouro).


Uma diferença crucial na aplicação do blockchain em termos de criptomoedas é que normalmente uma troca de moeda requer um terceiro como fiador. Isso seria semelhante a um banco ou empresa de cartão de crédito. No entanto, a aplicação da tecnologia blockchain em criptomoedas está interrompendo a necessidade de um terceiro, além de tornar as transações ponto a ponto não monetárias mais seguras e desejáveis.


Tecnologia Blockchain


Blockchain como um livro razão público: com redes individuais, as transações são hash e adicionadas a um registro público. As redes participantes mantêm e, portanto, aprovam o registro. O livro razão do blockchain é essencial para manter a validade como moeda. Além disso, torna possível a confiabilidade das criptomoedas descentralizadas.

Adicionando blocos ao blockchain: Para adicionar ao blockchain, os mineiros procuram o hash de destino. Isso se baseia em dados do blockheader. Cada blockheader contém versões do número do bloco, um timestamp da transação e o hash do bloco anterior, que contém o nonce.

Prova de trabalho: uma vez que o hash alvo foi resolvido, ele também produz uma prova de trabalho. Isso está relacionado ao SHA-256 e ao nível atual de dificuldade para resolvê-lo.

Nonce: O nonce é um “número usado apenas uma vez”, em um bloco de Bitcoin é um 32 bits (4 bytes). O valor do nonce é ajustado pelos mineiros. Portanto, o hash do bloco será menor ou igual ao destino atual da rede.


Blockchain Hashing


Algoritmos Hash


Algoritmos de hash são funções computacionais. O processo condensa os dados de entrada em um tamanho fixo, o resultado é uma saída que é um valor hash ou hash. Hashes identificam, comparam ou executam cálculos em arquivos e sequências de dados. Ao tentar adicionar uma blockchain de extensão, o programa deve resolver o hash de destino para que seja aceito como um novo bloco.


Hashes são determinísticos e resistentes à pré-imagem:


Determinístico: o resultado de um determinado conjunto de entrada de dados sempre terá o mesmo resultado. Isso torna possível acompanhar as transações e quase impossível recriar a entrada dos dados de saída (ou resistente à pré-imagem).


SHA-256:


Isso produz um hash de 256 bits. Dado que os dados são tão grandes, há muitos resultados possíveis para comparar os hashes e tentar resolver para trás. Portanto, se alguém quisesse tentar resolver um hash de destino, seria necessário começar com um hash aleatório de uma sequência - em seguida, testá-lo contra o hash de destino - isso levaria uma quantidade de vezes quase incalculável.

Resistência à colisão: o SHA-256 é resistente à colisão devido à grande quantidade de dados, portanto, chegar ao mesmo hash de destino ao mesmo tempo é quase impossível. Isso também é resultado do uso de um alvo com alta entropia mínima.


Árvores e raízes de Merkle


O Merkle Root resume todos os dados nas transações relacionadas. Que esse resumo seja armazenado no cabeçalho do bloco. Assim como vimos com hashes, altere um único detalhe em qualquer uma das transações; a raiz de Merkle é alterada. Usar uma árvore Merkle torna eficiente a garantia de que uma transação específica seja incluída em um conjunto. Em vez de passar por todos os blocos, você apenas verifica a raiz.


Funções Computacionais


Algoritmos de hash são funções computacionais. O processo condensa os dados de entrada em um tamanho fixo. Isso resulta em uma saída chamada hash ou valor hash. Hashes são usados ​​para identificar, comparar e executar cálculos em arquivos e strings de dados. Ao adicionar uma blockchain de extensão, o programa deve resolver para o hash de destino. Para que o novo bloco seja aceito, você deve resolver o hash de destino.


Características de Hashes


Determinístico: o resultado de um determinado conjunto de entrada de dados sempre terá o mesmo resultado. Isso torna possível acompanhar as transações. Também torna quase impossível recriar a entrada dos dados de saída (ou resistente à pré-imagem).


SHA-256:


Isso produz um hash de 256 bits. Dado que os dados são tão grandes, há muitos resultados possíveis para comparar os hashes e tentar resolver para trás. Portanto, se alguém quisesse tentar resolver um hash de destino, precisaria começar com uma sequência de hash aleatória. Em seguida, teste-o com o hash de destino. Isso levaria uma quantidade de tempo quase incalculável.

Resistência à colisão: o SHA-256 é resistente à colisão devido à grande quantidade de dados, portanto, chegar ao mesmo hash de destino ao mesmo tempo é quase impossível. Isso também é resultado do uso de um alvo com alta entropia mínima.


Árvores de Merkel e raízes de Merkel:


O Merkle Root resume todos os dados nas transações relevantes e os armazena no cabeçalho do bloco. Assim como vimos com os hashes, se um único detalhe em qualquer uma das transações muda, o mesmo ocorre com a Raiz Merkle. Usar uma árvore Merkle torna o teste de transações específicas mais eficiente. Muito mais do que passar por todos os blocos.


SHA-256:


Isso produz um hash de 256 bits. Dado que os dados são tão grandes, há muitos resultados possíveis para comparar os hashes; isso torna a resolução retroativa quase impossível. Portanto, se alguém quisesse tentar resolver um hash de destino, precisaria começar com uma sequência de hash aleatória e testá-la em relação ao hash de destino. Isso levaria uma quantidade de tempo quase incalculável.

Resistência à colisão: SHA-256 é resistente à colisão devido à grande quantidade de dados. Portanto, chegar ao mesmo hash de destino ao mesmo tempo é quase impossível. Isso também é resultado do uso de um alvo com alta entropia mínima.

0 visualização0 comentário

Posts recentes

Ver tudo