Meu entendimento é que um código hash e soma de verificação são coisas semelhantes - um valor numérico, calculado para um bloco de dados, que é relativamente único.
ou seja, a probabilidade de dois blocos de dados gerando o mesmo valor numérico de hash / checksum é baixa o suficiente para que possa ser ignorada para os propósitos do aplicativo.
Portanto, temos duas palavras para a mesma coisa ou existem diferenças importantes entre códigos hash e somas de verificação?
language-agnostic
hash
computer-science
checksum
Richard Ev
fonte
fonte
Respostas:
Eu diria que uma soma de verificação é necessariamente um código hash . No entanto, nem todos os códigos de hash são boas somas de verificação.
Uma soma de verificação tem um propósito especial - ela verifica ou verifica a integridade dos dados (alguns podem ir além, permitindo a correção de erros ). "Boas" somas de verificação são fáceis de calcular e podem detectar muitos tipos de corrupção de dados (por exemplo, um, dois, três bits errados).
Um hashcode simplesmente descreve uma função matemática que mapeia dados para algum valor. Quando usado como meio de indexação em estruturas de dados (por exemplo, uma tabela hash), uma baixa probabilidade de colisão é desejável.
fonte
Há um propósito diferente por trás de cada um deles:
Na prática, as mesmas funções costumam ser boas para os dois propósitos. Em particular, um código hash criptograficamente forte é uma boa soma de verificação (é quase impossível que um erro aleatório interrompa uma função hash forte), se você puder pagar o custo computacional.
fonte
De fato, existem algumas diferenças:
fonte
Hashcodes e checksums são usados para criar valores numéricos curtos de um item de dados. A diferença é que um valor de checksum deve mudar, mesmo se uma pequena modificação for feita no item de dados. Para um valor hash, o requisito é apenas que os itens de dados do mundo real devem ter valores hash distintos.
Um exemplo claro são as cordas. Uma soma de verificação para uma string deve incluir cada bit e questões de ordem. Um hashcode, por outro lado, pode frequentemente ser implementado como uma soma de verificação de um prefixo de comprimento limitado. Isso significaria que "aaaaaaaaaaba" teria o mesmo hash que "aaaaaaaaaaab", mas algoritmos de hash podem lidar com essas colisões.
fonte
A Wikipedia coloca bem:
fonte
Uma soma de verificação protege contra alterações acidentais.
Um hash criptográfico protege contra um invasor muito motivado.
Quando você envia bits na transmissão, pode acontecer acidentalmente que alguns bits sejam invertidos, excluídos ou inseridos. Para permitir que o receptor detecte (ou às vezes corrija) acidentes como esse, o remetente usa uma soma de verificação.
Mas se você presumir que há alguém ativamente e de forma inteligente modificando a mensagem na transmissão e deseja se proteger contra esse tipo de invasor, use um hash criptográfico (estou ignorando a assinatura criptográfica do hash, ou usando um canal secundário ou algo assim, desde a questão não parece escapar a isso).
fonte
Fonte: CompTIA ® Security + Guide to Network Security Fundamentals - Quinta edição - Mark Ciampa -Página 191
fonte
Hoje em dia eles são intercambiáveis, mas no passado, uma soma de verificação era uma técnica muito simples em que você adicionava todos os dados (geralmente em bytes) e acrescentava um byte no final com esse valor em ... então, esperançosamente saber se algum dos dados originais foi corrompido. Semelhante a um bit de verificação, mas com bytes.
fonte
A diferença entre o código hash e as funções de soma de verificação é que eles estão sendo projetados para finalidades diferentes.
Uma soma de verificação é usada para descobrir se algo na entrada mudou.
Um código hash é usado para descobrir se algo na entrada mudou e para ter o máximo de "distância" possível entre os valores do código hash individual.
Além disso, pode haver requisitos adicionais para uma função hash, em oposição a esta regra, como a capacidade de formar árvores / clusters / depósitos de valores de código hash antecipadamente.
E se você adicionar alguma randomização inicial compartilhada, chegará ao conceito de criptografia moderna / trocas de chaves.
Sobre Probabilidade:
Por exemplo, vamos supor que os dados de entrada sempre mudam (100% do tempo). E vamos supor que você tenha uma função hash / checksum "perfeita", que gera um valor hash / checksum de 1 bit. Portanto, você obterá valores diferentes de hash / checksum, 50% do tempo, para dados de entrada aleatórios.
Se exatamente 1 bit em seus dados de entrada aleatórios mudou, você será capaz de detectar isso 100% do tempo, não importa o tamanho dos dados de entrada.
Se 2 bits em seus dados de entrada aleatórios mudaram, sua probabilidade de detectar "uma mudança" é dividida por 2, porque ambas as mudanças podem se neutralizar, e nenhuma função hash / checksum detectaria que 2 bits são realmente diferentes nos dados de entrada .
...
Isso significa que, se o número de bits em seus dados de entrada for várias vezes maior do que o número de bits em seu valor de hash / checksum, sua probabilidade de realmente obter diferentes valores de hash / checksum, para diferentes valores de entrada, é reduzida e não é um constante .
fonte
Costumo usar a palavra soma de verificação quando me refiro ao código (numérico ou outro) criado para um arquivo ou parte dos dados que pode ser usada para verificar se o arquivo ou os dados não foram corrompidos. O uso mais comum que encontro é verificar se os arquivos enviados pela rede não foram alterados (deliberadamente ou não).
fonte
Na fragmentação de dados do cluster Redis, ele usa um
hash slot
para decidir para qual nó ele vai. Veja, por exemplo, a operação de módulo abaixo:O
6
surge duas vezes em entradas diferentes. O objetivo do hash é simplesmente mapear um valor de entrada para um valor de saída e a exclusividade não faz parte do negócio. Portanto, duas entradas diferentes que produzem a mesma saída estão bem no mundo dos hashes.Uma soma de verificação, por outro lado, deve diferenciar a saída, mesmo que um bit na entrada seja alterado, porque sua finalidade não é mapear, mas detectar dados corrompidos. Portanto, duas entradas diferentes que produzem a mesma saída não são aceitáveis em uma soma de verificação.
fonte
Uma soma de verificação é simplesmente um número gerado a partir do campo de dados por oring (por adição lógica, portanto, soma). A soma de verificação tem a capacidade de detectar a corrupção de qualquer bit ou número de bits dentro do campo de dados a partir do qual é gerado, ou seja, verifica se há erros, não pode corrigi-los. Uma soma de verificação é um hash porque o tamanho da soma de verificação é menor do que os dados originais. Sim, você terá colisões porque a soma de verificação não é totalmente sensível à posição do bit no campo de dados.
Uma verificação de redundância cíclica (CRC) é algo bem diferente, mais complexo e NÃO é chamado de checksum. É a aplicação de uma série polinomial que tem a capacidade de corrigir qualquer número escolhido de bits individuais corrompidos dentro do campo de dados a partir do qual foi gerado. A criação de um CRC resulta em um número maior em tamanho do que o campo de dados original (ao contrário da soma de verificação) - daí o nome incluir a palavra "redundância" e o preço que você paga pela capacidade de correção de erros. Portanto, um CRC NÃO é um hash e não deve ser confundido ou nomeado como uma soma de verificação, porque a redundância necessariamente aumenta o tamanho dos dados originais.
fonte