Diferença fundamental entre algoritmos de hashing e criptografia

Eu vejo muita confusão entre hashes e algoritmos de criptografia e gostaria de ouvir mais alguns conselhos de especialistas sobre:

  1. Quando usar hashes vs criptografia

  2. O que torna um hash ou algoritmo de criptografia diferente (de um nível teórico / matemático), ou seja, o que torna hashes irreversíveis (sem ajuda de uma tree arco-íris)

Aqui estão algumas perguntas SO semelhantes que não entraram em tantos detalhes quanto eu estava procurando:

Qual é a diferença entre Ofuscação, Hashing e Criptografia?
Diferença entre criptografia e hashing

Bem, você poderia procurá-lo na Wikipedia … Mas desde que você quer uma explicação, eu farei o meu melhor aqui:

Funções de hash

Eles fornecem um mapeamento entre uma input de comprimento arbitrário e uma saída (geralmente) de comprimento fixo (ou menor comprimento). Pode ser qualquer coisa, desde um simples crc32 até uma function hash criptográfica completa, como MD5 ou SHA1 / 2/256/512. O ponto é que há um mapeamento unidirecional acontecendo. É sempre um mapeamento de muitos: 1 (significando que sempre haverá colisões) já que cada function produz uma saída menor do que é capaz de inserir (se você alimentar cada arquivo de 1mb no MD5, você terá uma tonelada de colisões).

A razão pela qual eles são difíceis (ou impossíveis em praticidade) de reverter é por causa de como eles trabalham internamente. A maioria das funções hash criptográficas repetem o conjunto de input várias vezes para produzir a saída. Então, se olharmos para cada pedaço de input de comprimento fixo (que é dependente do algoritmo), a function hash chamará esse estado atual. Ele irá então iterar sobre o estado e alterá-lo para um novo e usá-lo como feedback em si (o MD5 faz isso 64 vezes para cada bloco de 512 bits de dados). Em seguida, ele de alguma forma combina os estados resultantes de todas essas iterações novamente para formar o hash resultante.

Agora, se você quiser decodificar o hash, primeiro precisará descobrir como dividir o dado hash em seus estados iterados (1 possibilidade de inputs menores que o tamanho de um bloco de dados, muitas para inputs maiores). Então você precisaria reverter a iteração para cada estado. Agora, para explicar por que isso é MUITO difícil, imagine tentar deduzir b da seguinte fórmula: 10 = a + b . Existem 10 combinações positivas de b que podem funcionar. Agora faça um loop sobre isso várias vezes: tmp = a + b; a = b; b = tmp tmp = a + b; a = b; b = tmp tmp = a + b; a = b; b = tmp . Por 64 iterações, você teria mais de 10 ^ 64 possibilidades para tentar. E isso é apenas uma adição simples em que algum estado é preservado da iteração para a iteração. Funções hash reais fazem muito mais do que 1 operação (o MD5 faz cerca de 15 operações em 4 variables ​​de estado). E como a próxima iteração depende do estado do anterior e do anterior é destruída na criação do estado atual, é quase impossível determinar o estado de input que levou a um determinado estado de saída (para cada iteração não menos). Combine isso, com o grande número de possibilidades envolvidas, e a decodificação até mesmo um MD5 levará uma quantidade quase infinita (mas não infinita) de resources. Tantos resources que é realmente mais barato forçar o hash se você tiver uma idéia do tamanho da input (para inputs menores) do que tentar decodificar o hash.

Funções de criptografia

Eles fornecem um mapeamento 1: 1 entre um comprimento arbitrário de input e saída. E eles são sempre reversíveis. O importante é notar que é reversível usando algum método. E é sempre 1: 1 para uma determinada chave. Agora, existem várias inputs: pares de chaves que podem gerar a mesma saída (na verdade, geralmente, dependendo da function de criptografia). Bons dados criptografados é indistinguível do ruído random. Isso é diferente de uma boa saída de hash que é sempre de um formato consistente.

Casos de Uso

Use uma function de hash quando quiser comparar um valor, mas não puder armazenar a representação simples (por qualquer número de razões). As senhas devem caber muito bem nesse caso de uso, já que você não deseja armazená-lo em texto sem formatação por motivos de segurança (e não deveria). Mas e se você quisesse verificar um sistema de arquivos em busca de arquivos de música piratas? Seria impraticável armazenar 3 mb por arquivo de música. Então, em vez disso, pegue o hash do arquivo e armazene-o (o md5 armazena 16 bytes em vez de 3 mb). Dessa forma, você apenas faz o hash de cada arquivo e compara com o database armazenado de hashes (isso não funciona tão bem na prática por causa da recodificação, alteração de headers de arquivo, etc, mas é um exemplo de caso de uso).

Use uma function de hash quando estiver verificando a validade dos dados de input. É para isso que eles são projetados. Se você tiver duas partes de input e quiser verificar se elas são iguais, execute ambas através de uma function hash. A probabilidade de uma colisão é astronomicamente baixa para pequenos tamanhos de input (assumindo uma boa function hash). É por isso que é recomendado para senhas. Para senhas de até 32 caracteres, md5 tem 4 vezes o espaço de saída. SHA1 tem 6 vezes o espaço de saída (aproximadamente). O SHA512 tem cerca de 16 vezes o espaço de saída. Você realmente não se importa com a senha, você se importa se é a mesma que foi armazenada. É por isso que você deve usar hashes para senhas.

Use criptografia sempre que precisar recuperar os dados de input. Observe a palavra necessidade . Se você está armazenando números de cartão de crédito, você precisa recuperá-los em algum momento, mas não deseja armazená-los em texto sem formatação. Então, armazene a versão criptografada e mantenha a chave o mais segura possível.

Funções hash também são ótimas para assinar dados. Por exemplo, se você estiver usando o HMAC, assinará um dado usando um hash dos dados concatenados com um valor conhecido, mas não transmitido (um valor secreto). Então, você envia o texto sem formatação e o hash HMAC. Em seguida, o receptor simplesmente hashes os dados enviados com o valor conhecido e verifica se ele corresponde ao HMAC transmitido. Se é o mesmo, você sabe que não foi adulterado por uma festa sem o valor secreto. Isso é comumente usado em sistemas de cookies seguros por estruturas HTTP, bem como na transmissão de mensagens de dados via HTTP, onde você deseja alguma garantia de integridade nos dados.

Uma nota sobre hashes para senhas:

Uma característica fundamental das funções hash criptográficas é que elas devem ser muito rápidas de criar, e muito difíceis / lentas de reverter (tanto que é praticamente impossível). Isso representa um problema com senhas. Se você armazena o sha512(password) , você não está fazendo nada para se proteger contra as tabelas do arco-íris ou ataques de força bruta. Lembre-se, a function hash foi projetada para velocidade. Portanto, é trivial para um invasor apenas executar um dictionary por meio da function hash e testar cada resultado.

Adicionar um sal ajuda, pois adiciona um pouco de dados desconhecidos ao hash. Então, ao invés de encontrar qualquer coisa que combine md5(foo) , eles precisam encontrar algo que, quando adicionado ao sal conhecido, produz md5(foo.salt) (o que é muito mais difícil de fazer). Mas ainda não resolve o problema de velocidade, pois se eles conhecem o sal, é apenas uma questão de passar o dictionary.

Então, existem maneiras de lidar com isso. Um método popular é chamado fortalecimento de chave (ou alongamento de chave). Basicamente, você itera um hash muitas vezes (geralmente em milhares). Isso faz duas coisas. Primeiro, ele diminui significativamente o tempo de execução do algoritmo hash. Segundo, se implementado corretamente (passando a input e o sal de volta em cada iteração), na verdade, aumenta a entropia (espaço disponível) para a saída, reduzindo as chances de colisões. Uma implementação trivial é:

 var hash = password + salt; for (var i = 0; i < 5000; i++) { hash = sha512(hash + password + salt); } 

Existem outras implementações mais padronizadas, como PBKDF2 , BCrypt . Mas essa técnica é usada por muitos sistemas relacionados à segurança (como PGP, WPA, Apache e OpenSSL).

A linha inferior, hash(password) não é boa o suficiente. hash(password + salt) é melhor, mas ainda não é bom o suficiente ... Use um mecanismo de hash esticado para produzir hashes de senha ...

Outra nota sobre alongamentos triviais

Em nenhuma circunstância, alimente a saída de um hash diretamente de volta à function hash :

 hash = sha512(password + salt); for (i = 0; i < 1000; i++) { hash = sha512(hash); // <-- Do NOT do this! } 

A razão para isso tem a ver com colisões. Lembre-se de que todas as funções hash possuem colisões porque o espaço de saída possível (o número de saídas possíveis) é menor que o espaço de input. Para ver porque, vamos ver o que acontece. Para começar isso, vamos supor que há uma chance de 0,001% de colisão de sha1()muito menor na realidade, mas para fins de demonstração).

 hash1 = sha1(password + salt); 

Agora, hash1 tem uma probabilidade de colisão de 0,001%. Mas quando fazemos o próximo hash2 = sha1(hash1); , todas as colisões de hash1 automaticamente se tornam colisões de hash2 . Portanto, agora, temos a taxa de hash1 em 0,001%, e a segunda chamada de sha1() aumenta isso. Então, agora, o hash2 tem uma probabilidade de colisão de 0,002%. Isso é o dobro de chances! Cada iteração adicionará mais 0.001% chance de colisão ao resultado. Assim, com 1000 iterações, a chance de colisão saltou de um valor trivial de 0,001% para 1%. Agora, a degradação é linear, e as probabilidades reais são muito menores, mas o efeito é o mesmo (uma estimativa da chance de uma única colisão com md5 é de cerca de 1 / (2 128 ) ou 1 / (3x10 38 ). que parece pequeno, graças ao ataque de aniversário não é tão pequeno quanto parece.

Em vez disso, ao append novamente o salt e a senha toda vez, você estará reintroduzindo dados na function hash. Portanto, quaisquer colisões de qualquer rodada em particular não são mais colisões da próxima rodada. Assim:

 hash = sha512(password + salt); for (i = 0; i < 1000; i++) { hash = sha512(hash + password + salt); } 

Tem a mesma chance de colisão que a function nativa do sha512 . Qual é o que você quer. Use isso em seu lugar.

Uma function hash pode ser considerada o mesmo que assar um pedaço de pão. Você começa com insumos (farinha, água, fermento, etc …) e depois de aplicar a function hash (mistura + panificação), você acaba com uma saída: um pedaço de pão.

Indo para o outro lado é extraordinariamente difícil – você não pode realmente separar o pão de volta em farinha, água, fermento – parte do que foi perdido durante o processo de cozimento, e você nunca sabe exatamente quanto de água, farinha ou fermento foi usado. um pão em particular, porque essa informação foi destruída pela function hash (também conhecida como forno).

Muitas variantes diferentes de inputs teoricamente produzirão pães idênticos (por exemplo, 2 xícaras de água e 1 tsbp de levedura produzem exatamente o mesmo pão que 2,1 xícaras de água e 0,9tsbp de fermento), mas dado um desses pães, você não pode dizer exatamente o que combo de insumos produziu.

A criptografia, por outro lado, pode ser vista como um cofre. Tudo o que você colocar lá volta, contanto que você possua a chave com a qual ele foi trancado em primeiro lugar. É uma operação simétrica. Dada uma chave e alguma input, você obtém uma certa saída. Dada essa saída e a mesma chave, você recuperará a input original. É um mapeamento 1: 1.

Use hashes quando não quiser recuperar a input original, use a criptografia quando fizer isso.

Os hashes pegam alguma input e a transformam em alguns bits (geralmente considerados como um número, como um inteiro de 32 bits, um inteiro de 64 bits, etc). A mesma input sempre produzirá o mesmo hash, mas você PRINCIPALMENTE perde as informações no processo para que você não possa reproduzir de maneira confiável a input original (no entanto, há algumas advertências).

A criptografia preserva principalmente toda a informação que você coloca na function de criptografia, apenas torna difícil (idealmente impossível) para qualquer um reverter a input original sem possuir uma chave específica.

Exemplo simples de hashing

Aqui está um exemplo trivial para ajudá-lo a entender por que o hashing não pode (no caso geral) recuperar a input original. Digamos que estou criando um hash de 1 bit. Minha function hash usa uma string de bits como input e configura o hash para 1 se houver um número par de bits definidos na string de input, senão 0 se houver um número ímpar.

Exemplo:

 Input Hash 0010 0 0011 1 0110 1 1000 0 

Observe que há muitos valores de input que resultam em um hash de 0 e muitos que resultam em um hash de 1. Se você souber que o hash é 0, não é possível saber com certeza qual foi a input original.

By the way, este hash de 1 bit não é exatamente inventado … dê uma olhada no bit de paridade .

Exemplo simples de criptografia

Você pode criptografar texto usando uma simples substituição de letra, diga se a input é A, você escreve B. Se a input é B, você escreve C. Todo o caminho até o final do alfabeto, onde se a input é Z, você escreva A novamente.

 Input Encrypted CAT DBU ZOO APP 

Assim como o simples exemplo de hash, esse tipo de criptografia tem sido usado historicamente .

Visão geral básica de hash e técnicas de criptografia / descriptografia são.

Hashing:

Se você hash qualquer texto simples novamente, você não pode obter o mesmo texto sem formatação de texto com hash . Simplesmente, é um processo unidirecional.

hashing


Criptografia e Descriptografia:

Se você criptografar qualquer texto simples com uma chave novamente, poderá obter o mesmo texto sem formatação , fazendo a descriptografia em texto criptografado com a mesma chave (simétrica) / diferente (asymentric).

criptografia e descriptografia


ATUALIZAÇÃO: Para abordar os pontos mencionados na questão editada.

1. Quando usar hashes vs criptografias

O hashing é útil se você quiser enviar um arquivo para alguém. Mas você tem medo de que alguém mais intercepte o arquivo e o altere. Portanto, uma maneira que o destinatário possa ter certeza de que é o arquivo correto é se você publicar o valor de hash publicamente. Dessa forma, o destinatário pode calcular o valor de hash do arquivo recebido e verificar se ele corresponde ao valor de hash.

A criptografia é boa se você disser ter uma mensagem para enviar para alguém. Você criptografa a mensagem com uma chave e o destinatário descriptografa com a mesma (ou talvez uma diferente) chave para recuperar a mensagem original. créditos


2. O que torna um hash ou algoritmo de criptografia diferente (de um nível teórico / matemático), ou seja, o que torna hashes irreversíveis (sem ajuda de uma tree arco-íris)

Basicamente, o hashing é uma operação que perde informações, mas não criptografia . Vamos olhar para a diferença de maneira matemática simples para o nosso fácil entendimento , é claro que ambos têm operações matemáticas muito mais complicadas com repetições envolvidas

Criptografia / descriptografia (reversível):

Adição :

 4 + 3 = 7 

Isso pode ser revertido tomando a sum e subtraindo um dos adendos

 7 - 3 = 4 

Multiplicação :

 4 * 5 = 20 

Isso pode ser revertido tomando o produto e dividindo por um dos fatores

 20 / 4 = 5 

Então, aqui podemos supor que um dos adendos / fatores é uma chave decripta e o resultado (7,20) é um texto criptografado.


Hashing (não reversível):

Divisão Modulo :

 22 % 7 = 1 

Isso não pode ser revertido porque não há nenhuma operação que você possa fazer para o quociente e o dividendo para reconstituir o divisor (ou vice-versa).

Você pode encontrar uma operação para preencher onde o ‘? é?

 1 ? 7 = 22 1 ? 22 = 7 

Assim, as funções hash têm a mesma qualidade matemática da divisão do módulo e perdem a informação.

créditos

Meu forro … geralmente o entrevistador queria a resposta abaixo.

Hashing é um caminho. Você não pode converter seus dados / string de um código hash.

A criptografia é de 2 vias – você pode descriptografar novamente a string criptografada se tiver a chave com você.

Uma function de hash transforma uma quantidade de texto de tamanho variável em um texto de tamanho fixo.

Jogo da velha

Fonte: https://en.wikipedia.org/wiki/Hash_function

Uma function de criptografia transforma um texto em um texto cifrado sem sentido usando uma chave de criptografia e vice-versa. insira a descrição da imagem aqui

Fonte: https://en.wikipedia.org/wiki/Encryption

Vamos ver em ação. Eu uso php para isso.

JOGO DA VELHA:

 $str = 'My age is 29'; $hash = hash('sha1', $str); echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e 

DEHASH:

SHA1 é um hash unidirecional. O que significa que você não pode fazer o hash. No entanto, você pode forçar o hash a força bruta. Por favor, veja: https://hashkiller.co.uk/sha1-decrypter.aspx . Você pode encontrar um MD5 dehasher neste site: http://md5portal.com/ .

ENCRYPT:

 $cipher = MCRYPT_RIJNDAEL_128; $key = 'A_KEY'; $data = 'My age is 29'; $mode = MCRYPT_MODE_ECB; $encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode); var_dump($encryptedData); //OUTPUT: string '„Ùòyªq³¿ì¼üÀpå' (length=16) 

DESCRIPTAR:

 $decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode); $decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END var_dump($decryptedData); //OUTPUT: string 'My age is 29' (length=12) 

—— Editar ——————

A extensão Mcrypt foi descontinuada em 7.1. e removido em php 7.2. A extensão openssl pode ser usada nessas versões php. Veja os trechos de código abaixo:

 $key = 'A_KEY'; $data = 'My age is 29'; // ENCRYPT $encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01'); var_dump($encryptedData); // DECRYPT $decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01'); var_dump($decryptedData); //OUTPUT string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24) string 'My age is 29' (length=12) 

Criptografia Simétrica:

A criptografia simétrica também pode ser chamada de chave compartilhada ou criptografia secreta compartilhada. Na criptografia simétrica, uma única chave é usada para criptografar e descriptografar o tráfego.

insira a descrição da imagem aqui

Criptografia Assimétrica:

A criptografia assimétrica também é conhecida como criptografia de chave pública. A criptografia assimétrica difere da criptografia simétrica principalmente em que duas chaves são usadas: uma para criptografia e uma para descriptografia. O algoritmo de criptografia assimétrica mais comum é o RSA .

Em comparação com a criptografia simétrica, a criptografia assimétrica impõe uma alta carga computacional e tende a ser muito mais lenta. Assim, normalmente não é empregado para proteger dados de carga útil. Em vez disso, sua maior força é a capacidade de estabelecer um canal seguro em um meio não seguro (por exemplo, a Internet). Isso é realizado pela troca de chaves públicas, que só podem ser usadas para criptografar dados. A chave privada complementar, que nunca é compartilhada, é usada para descriptografar.

insira a descrição da imagem aqui

Hashing:

Finalmente, o hashing é uma forma de segurança criptográfica que difere da criptografia. Enquanto a criptografia é um processo de duas etapas usado para criptografar primeiro e depois descriptografar uma mensagem, o hash condensa uma mensagem em um valor irreversível de comprimento fixo ou hash. Dois dos algoritmos de hash mais comuns vistos na rede são o MD5 e o SHA-1 .

insira a descrição da imagem aqui

Leia mais aqui: http://packetlife.net/blog/2010/nov/23/symmetric-symmetric-encryption-hashing/

  1. Use hashes quando você só precisa ir para um lado. Por exemplo, para senhas em um sistema, você usa hashing porque você só verificará se o valor inserido por um usuário, após hashing, corresponde ao valor em seu repository. Com criptografia, você pode ir de duas maneiras.

  2. Algoritmos hash e algoritmos de criptografia são apenas algoritmos matemáticos. Então, nesse aspecto, elas não são diferentes – são apenas fórmulas matemáticas. Semântica sábia, porém, há a grande diferença entre hashing (unidirecional) e encriptação (bidirecional). Por que os hashes são irreversíveis? Porque eles são projetados para ser assim, porque às vezes você quer uma operação unidirecional.

Criptografia e algoritmos hash funcionam de maneira semelhante. Em cada caso, existe a necessidade de criar confusão e difusão entre os bits. Resumida, a confusão está criando uma relação complexa entre a chave e o texto cifrado, e a difusão está espalhando as informações de cada bit.

Muitas funções hash usam algoritmos de criptografia (ou primitivos de algoritmos de criptografia. Por exemplo, o candidato Skein do SHA-3 usa o Threefish como o método subjacente para processar cada bloco. A diferença é que, em vez de manter cada bloco de texto cifrado, eles são destrutivamente, fundido deterministicamente em conjunto para um comprimento fixo

quando se trata de segurança para transmissão de dados, ou seja, comunicação bidirecional você usa criptografia.Todas a criptografia requer uma chave

quando se trata de autorização você usa hashing. Não há chave no hashing

O hash aceita qualquer quantidade de dados (binário ou texto) e cria um hash de tamanho constante que representa uma sum de verificação para os dados. Por exemplo, o hash pode ter 16 bytes. Algoritmos de hash diferentes produzem hashes de tamanho diferentes. Obviamente, não é possível recriar os dados originais a partir do hash, mas você pode alterar os dados novamente para ver se o mesmo valor de hash é gerado. As senhas unidirecionais baseadas em Unix funcionam dessa maneira. A senha é armazenada como um valor de hash e, para efetuar login em um sistema, a senha digitada é criptografada e o valor de hash é comparado com o hash da senha real. Se eles correspondem, então você deve ter typescript a senha correta

Por que o hashing é irreversível?

O hashing não é reversível porque o mapeamento de input para hash não é de 1 para 1. Ter duas inputs mapeadas para o mesmo valor de hash é geralmente chamado de “colisão de hash”. Por motivos de segurança, uma das propriedades de uma function de hash “boa” é que as colisões são raras no uso prático.

Criptografia O objective da criptografia é transformar os dados para mantê-los em segredo, por exemplo, (Enviar a alguém um texto secreto que eles só deveriam saber ler, enviando senhas pela Internet).

Em vez de focar a usabilidade, o objective é garantir que o envio de dados possa ser enviado secretamente e só possa ser visto pelo usuário que você enviou.

Criptografa os dados em outro formato de transformá-los em um padrão único que pode ser criptografado com a chave secreta e aqueles usuários que possuem a chave secreta podem ver a mensagem por reversão do processo. Por exemplo (AES, BLOWFISH, RSA)

A criptografia pode simplesmente parecer com isso FhQp6U4N28GITVGjdt37hZN

Hashing Em tecnicamente podemos dizê-lo como uma input arbitrária e produziu uma string de comprimento fixo.

A coisa mais importante nestes é que você não pode ir da saída para a input. Produz a forte saída que a informação dada não foi modificada. O processo consiste em receber uma input e um hash e, em seguida, enviar com a chave privada do remetente, uma vez que o destinatário receba, pode validá-lo com a chave pública do remetente.

Se o hash estiver errado e não corresponder ao hash, não poderemos ver nenhuma das informações. Por exemplo (MD5, SHA …..)

Criptografia lida com números e seqüências de caracteres. Basicamente, todas as coisas digitais em todo o universo são números. Quando digo números, são 0 e 1. Você sabe o que são, binários. As imagens que você vê na canvas, a música que você ouve no seu fone de ouvido, tudo são binários. Mas nossos ouvidos e olhos não vão entender binários, certo? Apenas o cérebro pode entender isso, e mesmo que ele entenda binários, não pode desfrutar de binários. Então nós convertemos os binários em formatos compreensíveis para humanos como mp3, jpg, etc. Vamos denominar o processo como codificação . É um processo bidirecional e pode ser facilmente decodificado de volta à sua forma original.

Hashing

O hashing é outra técnica de criptografia na qual os dados, uma vez convertidos para alguma outra forma, nunca podem ser recuperados. No termo de Layman, não há processo chamado de hashing . Existem muitas funções hash para fazer o trabalho, como sha-512, md5 e assim por diante.

Se o valor original não puder ser recuperado, então onde usamos isso? Senhas! Quando você configura uma senha para seu celular ou PC, um hash da sua senha é criado e armazenado em um local seguro. Quando você faz uma tentativa de login na próxima vez, a string inserida é novamente dividida com o mesmo algoritmo (function hash) e a saída é correspondida com o valor armazenado. Se é o mesmo, você está logado. Caso contrário, você será expulso.

Créditos: wikimedia Ao aplicar o hash à senha, podemos garantir que um invasor nunca receberá nossa senha, mesmo que ele roube o arquivo de senha armazenado. O atacante terá o hash da senha. Ele provavelmente pode encontrar uma lista das senhas mais usadas e aplicar o sha-512 a cada uma delas e compará-la com o valor em sua mão. É chamado o ataque do dictionary . Mas quanto tempo ele faria isso? Se sua senha for aleatória o suficiente, você acha que esse método de quebra funcionaria? Todas as senhas nos bancos de dados do Facebook, Google e Amazon estão com hash, ou pelo menos supostamente estão com hash.

Então há Criptografia

A criptografia está entre o hashing e a codificação. A codificação é um processo bidirecional e não deve ser usada para fornecer segurança. A criptografia também é um processo bidirecional, mas os dados originais podem ser recuperados se e somente se a chave de criptografia for conhecida. Se você não sabe como funciona a criptografia, não se preocupe, vamos discutir o básico aqui. Isso seria suficiente para entender os fundamentos do SSL. Portanto, existem dois tipos de criptografia, a criptografia simétrica e assimétrica.

Criptografia de chave simétrica

Estou tentando manter as coisas o mais simples que pude. Então, vamos entender a criptografia simétrica por meio de um algoritmo de mudança. Este algoritmo é usado para criptografar alfabetos, deslocando as letras para a esquerda ou para a direita. Vamos pegar uma string CRYPTO e considerar um número +3. Então, o formato criptografado do CRYPTO será FUBSWR. Isso significa que cada letra é deslocada para a direita por 3 lugares. Aqui, a palavra CRYPTO é chamada Plaintext , a saída FUBSWR é chamada de Ciphertext , o valor +3 é chamado de Criptografia (chave simétrica) e todo o processo é uma cifra . Este é um dos mais antigos e básicos algoritmos de criptografia de chave simétrica e seu primeiro uso foi relatado durante o tempo de Júlio César. Então, foi nomeado após ele e é o famoso César Cipher . Qualquer pessoa que conheça a chave de criptografia e possa aplicar o inverso do algoritmo de Caesar e recuperar o Texto simples original. Por isso, é chamado de criptografia simétrica .

Criptografia de chave assimétrica

Sabemos que, na criptografia Simétrica, a mesma chave é usada para criptografia e descriptografia. Uma vez que essa chave é roubada, todos os dados desaparecem. Isso é um risco enorme e precisamos de uma técnica mais complexa. Em 1976, Whitfield Diffie e Martin Hellman publicaram pela primeira vez o conceito de criptografia assimétrica e o algoritmo era conhecido como troca de chaves Diffie-Hellman . Então, em 1978, Ron Rivest, Adi Shamir e Leonard Adleman, do MIT, publicaram o algoritmo RSA . Estes podem ser considerados como a base da criptografia assimétrica.

Em comparação com a criptografia simétrica, na criptografia assimétrica , haverá duas chaves em vez de uma. Uma é chamada de chave pública e a outra é a chave privada . Teoricamente, durante o início, podemos gerar o par de chaves Público-Privado para nossa máquina. A chave privada deve ser mantida em um local seguro e nunca deve ser compartilhada com ninguém. A chave pública, como o nome indica, pode ser compartilhada com qualquer pessoa que deseje enviar texto criptografado para você. Agora, aqueles que têm sua chave pública podem criptografar os dados secretos com ela. Se o par de chaves foi gerado usando o algoritmo RSA, eles devem usar o mesmo algoritmo ao criptografar os dados. Normalmente, o algoritmo será especificado na chave pública. Os dados criptografados só podem ser descriptografados com a chave privada que pertence a você.

Fonte: SSL / TLS para dummies parte 1: Ciphersuite, Hashing, Encryption | WST ( https://www.wst.space/ssl-part1-ciphersuite-hahing-encryption/ )