Diferença fundamental entre os algoritmos de hash e criptografia

509

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 criptografias

  2. O que torna um algoritmo de hash ou criptografia diferente (do nível teórico / matemático), isto é, o que torna os hashes irreversíveis (sem o auxílio de uma árvore arco-íris)

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

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

Kenny Cason
fonte
28
Eu posso prever que esta é a pergunta a que as pessoas se referem quando confundem os termos. :)
Adam Paynter
18
hashing é uma forma (não pode ser revertida), encriptação é bidireccional (pode ser descriptografado)
bestsss
Hashes também são úteis para indexar grandes estruturas e objetos, como arquivos. Veja tabela de hash .
HABO
22
Hashing é como um moedor de carne. Você pode transformar uma vaca em hambúrguer, mas não o contrário.
Neil McGuigan
Percebi que minha pergunta foi editada. Eu sempre soube as diferenças de nível superior entre os dois, mas estava mais curioso sobre as diferenças matemáticas e de baixo nível. :) De qualquer forma, muito conteúdo bom para SO! Muito Obrigado!
Kenny Cason

Respostas:

738

Bem, você pode procurar na Wikipedia ... Mas como você quer uma explicação, farei o meu melhor aqui:

Funções de hash

Eles fornecem um mapeamento entre uma entrada arbitrária de comprimento e uma saída (geralmente) de comprimento fixo (ou comprimento menor). Pode ser qualquer coisa, desde um simples crc32 até uma função hash criptográfica completa, como MD5 ou SHA1 / 2/256/512. O ponto é que há um mapeamento unidirecional em andamento. É sempre um mapeamento de muitos: 1 (o que significa que sempre haverá colisões), pois cada função produz uma saída menor do que é capaz de inserir (se você alimentar todos os arquivos de 1 MB no MD5, você terá várias colisões).

A razão pela qual eles são difíceis (ou impossíveis de serem praticados) de reverter é por causa de como eles trabalham internamente. A maioria das funções de hash criptográfico itera sobre a entrada definida muitas vezes para produzir a saída. Portanto, se observarmos cada pedaço de entrada de comprimento fixo (que depende do algoritmo), a função hash chamará esse estado atual. Ele irá percorrer o estado e alterá-lo para um novo e usá-lo como feedback em si mesmo (o MD5 faz isso 64 vezes para cada bloco de dados de 512 bits). De alguma forma, ele 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 hash especificado em seus estados iterados (1 possibilidade de entradas menores que o tamanho de um pedaço de dados, muitas para entradas maiores). Então você precisaria reverter a iteração para cada estado. Agora, para explicar por que isso é muito difícil, imagine tentar deduzir ae ba partir da seguinte fórmula: 10 = a + b. Existem 10 combinações positivas ae bque podem funcionar. Agora, repita isso várias vezes:tmp = a + b; a = b; b = tmp. Para 64 iterações, você teria mais de 10 ^ 64 possibilidades para tentar. E isso é apenas uma simples adição em que algum estado é preservado de iteração para iteração. Funções hash reais realizam muito mais que 1 operação (o MD5 realiza cerca de 15 operações em 4 variáveis ​​de estado). E como a próxima iteração depende do estado do anterior e o anterior é destruído na criação do estado atual, é praticamente impossível determinar o estado de entrada 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 decodificar até um MD5 levará uma quantidade quase infinita (mas não infinita) de recursos. Tantos recursos que

Funções de criptografia

Eles fornecem um mapeamento 1: 1 entre uma entrada e saída arbitrárias de comprimento. E eles são sempre reversíveis. O importante a ser observado é que é reversível usando algum método. E é sempre 1: 1 para uma determinada chave. Agora, existem várias entradas: pares de chaves que podem gerar a mesma saída (na verdade, geralmente existem, dependendo da função de criptografia). Bons dados criptografados são indistinguíveis de ruídos aleatórios. Isso é diferente de uma boa saída de hash, que sempre tem um formato consistente.

Casos de Uso

Use uma função de hash quando desejar comparar um valor, mas não puder armazenar a representação simples (por várias razões). As senhas devem se encaixar muito bem neste caso de uso, pois você não deseja armazená-las em texto sem formatação por motivos de segurança (e não deve). Mas e se você quiser verificar um sistema de arquivos em busca de arquivos de música pirateados? Seria impraticável armazenar 3 mb por arquivo de música. Portanto, pegue o hash do arquivo e armazene-o (o md5 armazenaria 16 bytes em vez de 3mb). Dessa forma, você apenas faz o hash de cada arquivo e o compara com o banco de dados armazenado de hashes (isso não funciona tão bem na prática devido à recodificação, alteração de cabeçalhos de arquivos, etc., mas é um exemplo de caso de uso).

Use uma função de hash ao verificar a validade dos dados de entrada. É para isso que eles foram projetados. Se você possui duas partes de entrada e deseja verificar se são iguais, execute as duas por meio de uma função hash. A probabilidade de uma colisão é astronomicamente baixa para tamanhos de entrada pequenos (assumindo uma boa função de hash). É por isso que é recomendado para senhas. Para senhas de até 32 caracteres, o md5 possui 4 vezes o espaço de saída. O SHA1 possui 6 vezes o espaço de saída (aproximadamente). O SHA512 possui cerca de 16 vezes o espaço de saída. Você realmente não ligo para o que a senha foi , você se importa se é o mesmo que aquele que foi armazenado. É por isso que você deve usar hashes para senhas.

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

As funções de hash também são ótimas para assinar dados. Por exemplo, se você estiver usando o HMAC, assine um pedaço de dados usando um hash dos dados concatenado 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 faz o hash dos dados enviados com o valor conhecido e verifica se ele corresponde ao HMAC transmitido. Se for o mesmo, você sabe que não foi adulterado por uma parte sem o valor secreto. Isso é comumente usado em sistemas de cookies seguros por estruturas HTTP, bem como na transmissão de mensagens de dados por HTTP, onde você deseja alguma garantia de integridade nos dados.

Uma observação sobre hashes para senhas:

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

A adição de um sal ajuda as coisas, pois adiciona um pouco de dados desconhecidos ao hash. Então, em vez de encontrar algo que corresponda 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 da velocidade, pois se eles conhecem o sal, é apenas uma questão de analisar o dicionário.

Então, existem maneiras de lidar com isso. Um método popular é chamado fortalecimento de teclas (ou alongamento de teclas). Basicamente, você itera sobre um hash muitas vezes (geralmente milhares). Isso faz duas coisas. Primeiro, diminui significativamente o tempo de execução do algoritmo de hash. Segundo, se implementado corretamente (passando a entrada e o sal de volta a 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 padrão, 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 estendido para produzir hashes de senha ...

Outra nota sobre alongamento trivial

Em nenhuma circunstância alimente a saída de um hash diretamente de volta à função 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 de hash têm 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 entrada. Para ver o porquê, vejamos o que acontece. Para anteceder isso, vamos supor que haja uma chance de 0,001% de colisão sha1()muito menor na realidade, mas para fins de demonstração).

hash1 = sha1(password + salt);

Agora, hash1tem uma probabilidade de colisão de 0,001%. Mas quando fazemos o próximo hash2 = sha1(hash1);, todas as colisões de hash1automaticamente se tornam colisões dehash2 . Então, agora, temos a taxa de hash1 em 0,001%, e a segunda sha1()chamada aumenta isso. Então agora, hash2tem uma probabilidade de colisão de 0,002%. Isso é duas vezes mais chances! Cada iteração adicionará outra 0.001%chance de colisão ao resultado. Assim, com 1000 iterações, a chance de colisão saltou de 0,001% para 1% trivial. 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) Embora isso pareça pequeno, graças ao ataque de aniversário , não é tão pequeno quanto parece).

Em vez disso, ao anexar novamente o salt e a senha a cada vez, você reintroduz os dados na função hash. Portanto, quaisquer colisões de qualquer rodada específica 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 sha512função nativa . Qual é o que você quer. Use isso em vez disso.

ircmaxell
fonte
30
Pena que os programadores no LinkedIn não leram isso antes de armazenar senhas como hash SHA1 sem sal ... money.cnn.com/2012/06/06/technology/linkedin-password-hack/…
Eric J.
2
@ Pacerier: também dá um pouco de ênfase ao hash. Ele entra em detalhes especificamente sobre hashing de senha ...
ircmaxell
1
Eu não entendo como pode ser um mapeamento de 1 para 1, se houver várias chaves resultando na mesma saída. Para DES, o comprimento da chave é 56 bits e os tamanhos dos blocos são 64 bits. Portanto, não existem 256 chaves diferentes que podem mapear para o mesmo bloco de saída?
MrQWERTY
1
@ Renren29 sim. Você está certo. Na prática, a cifra inteira não é nem adjetiva nem injetiva. No entanto, para uma determinada chave, ela é subjetiva (cada texto simples possui exatamente um texto cifrado), mas não necessariamente injetivo (nem todo texto cifrado possível tem um mapeamento de volta). Por isso eu disse que é sempre 1: 1 para uma determinada chave . Se não houvesse várias chaves que pudessem gerar saída para o mesmo bloco de saída, a cifra não seria útil, pois o texto cifrado lhe diria algo sobre a chave (sem saber).
Ircmaxell
7
Ótima resposta. Meu único argumento é que a degradação do alongamento trivial não pode ser linear ou, eventualmente, passaria 100%. Acho que no seu exemplo com 0,001%, o segundo passo deve ser 0,001 + (1 - 0,001) * 0,001 ou 0,001999.
AlexDev 11/06
160

Uma função hash pode ser considerada a mesma que assar um pedaço de pão. Você começa com entradas (farinha, água, fermento, etc ...) e depois de aplicar a função hash (mistura + assar), 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 e fermento - parte disso foi perdida durante o processo de cozimento e você nunca pode dizer exatamente quanta água, farinha ou fermento foi usado para um pão em particular, porque essa informação foi destruída pela função hash (também conhecida como forno).

Teoricamente, muitas variantes diferentes de entradas produzem pães idênticos (por exemplo, 2 xícaras de água e 1 tsbp de fermento 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 qual combinação de entradas o produziu.

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

Marc B
fonte
2
Só que você não pode mostrar facilmente que um hambúrguer em particular veio inteiramente de uma vaca em particular, que é uma propriedade fundamental de um hash, por isso é uma ideia engraçada, mas uma analogia terrível.
user467257
1
@caf lol de fato e um clássico nisso. No entanto, a vaca quase nunca chega ao mercado, é o "touro" que faz ;-) Vaca: leite. Touro: carne.
Funk Quarenta Niner
1
Esta história por trás disso parece super saborosa.
sitilge
44

Use hashes quando não desejar recuperar a entrada original, use criptografia quando desejar.

Os hashes recebem alguma entrada e a transformam em alguns bits (geralmente considerados como um número, como um número inteiro de 32 bits, número inteiro de 64 bits, etc.). A mesma entrada sempre produzirá o mesmo hash, mas você PRINCIPALMENTE perde informações no processo para não poder reproduzir com segurança a entrada original (no entanto, existem algumas ressalvas).

A criptografia preserva principalmente todas as informações que você coloca na função de criptografia, apenas dificulta (idealmente impossível) que alguém retorne à entrada original sem possuir uma chave específica.

Exemplo simples de hash

Aqui está um exemplo trivial para ajudá-lo a entender por que o hash não pode (no caso geral) recuperar a entrada original. Digamos que estou criando um hash de 1 bit. Minha função hash usa uma string de bits como entrada e define o hash como 1 se houver um número par de bits definido na string de entrada, caso contrário, 0 se houver um número ímpar.

Exemplo:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Observe que existem muitos valores de entrada que resultam em um hash 0 e muitos que resultam em um hash 1. Se você sabe que o hash é 0, não pode saber com certeza qual era a entrada original.

A propósito, esse hash de 1 bit não é exatamente artificial ... dê uma olhada no bit de paridade .

Exemplo simples de criptografia

Você pode criptografar o texto usando uma substituição simples de letra, digamos que se a entrada for A, escreva B. Se a entrada for B, escreva C. Até o final do alfabeto, onde se a entrada for Z, você escreva A novamente.

Input   Encrypted
CAT     DBU
ZOO     APP

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

Eric J.
fonte
Vale a pena notar que "criptografia" refere-se coloquialmente a criptografia forte e não deve ser confundida com criptografia fraca, como a cifra de César no exemplo acima.
Fax
@Fax Sim, mas o que constitui uma criptografia forte tem sido uma barra móvel ao longo dos tempos. A Enigma Machine alemã da Segunda Guerra Mundial era quase impossível de decifrar (há um ótimo filme sobre isso). Hoje, seu relógio inteligente pode quebrá-lo facilmente. O DES já foi considerado forte, assim como o MD5. A forte criptografia de hoje ameaça ser presa fácil das técnicas de computação quântica no futuro próximo.
Eric J.
Com certeza, e é sempre uma boa ideia verificar as datas de postagens e artigos que dão conselhos sobre criptografia. Dito isto, tenho certeza de que a cifra de César foi considerada fraca, mesmo em 2011.
Fax
39

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

Hashing:

Se você hash qualquer texto sem formatação novamente, não será possível obter o mesmo texto sem formatação . Simplesmente, é um processo de mão única.

hash


Criptografia e descriptografia:

Se você criptografar qualquer texto simples com uma chave de novo, você pode obter mesmo texto simples , fazendo descriptografia em texto criptografado com o mesmo (symetric) Tecla / diffrent (asymentric).

criptografia e descriptografia


ATUALIZAÇÃO: Para abordar os pontos mencionados na pergunta editada.

1. Quando usar hashes vs criptografias

O hash é útil se você quiser enviar um arquivo para alguém. Mas você tem medo de que outra pessoa possa interceptar o arquivo e alterá-lo. Portanto, o destinatário pode ter certeza de que é o arquivo certo se publicar o valor do hash publicamente. Dessa forma, o destinatário pode calcular o valor do hash do arquivo recebido e verificar se ele corresponde ao valor do hash.

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


2. O que torna um algoritmo de hash ou criptografia diferente (do nível teórico / matemático), isto é, o que torna os hashes irreversíveis (sem o auxílio de uma árvore arco-íris)

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

Criptografia / descriptografia (reversível):

Adição :

4 + 3 = 7  

Isso pode ser revertido pegando a soma e subtraindo um dos adendos

7 - 3 = 4     

Multiplicação :

4 * 5 = 20  

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

20 / 4 = 5    

Portanto, aqui podemos assumir que um dos adendos / fatores é uma chave de decriptografia e o resultado (7,20) é um texto criptografado.


Hashing (não reversível):

Divisão Módulo :

22 % 7 = 1   

Isso não pode ser revertido porque não há operação que você possa fazer com 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

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

créditos

mrsrinivas
fonte
26

Meu forro único ... geralmente o entrevistador queria a resposta abaixo.

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

A criptografia é bidirecional - você pode descriptografar novamente a sequência criptografada se tiver a chave com você.

Shiv Mohan
fonte
Ei! São duas linhas.
MarkStorer4
17

Uma função Hash transforma uma quantidade de texto de tamanho variável em um texto de tamanho fixo.

Cerquilha

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


Funções hash em PHP

Um hash transforma uma string em uma string com hash. Ver abaixo.

CERQUILHA:

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

As senhas são geralmente armazenadas em sua representação em hash, em vez de texto legível. Quando um usuário final deseja obter acesso a um aplicativo protegido com uma senha, uma senha deve ser fornecida durante a autenticação. Quando o usuário envia sua senha, o sistema de autenticação válido recebe a senha e faz o hash dessa senha. Esse hash da senha é comparado ao hash conhecido pelo sistema. O acesso é concedido em caso de igualdade.

DEHASH:

SHA1 é um hash unidirecional. O que significa que você não pode desmontar o hash.

No entanto, você pode forçar o hash com força bruta. Consulte: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5, é outro hash. Um dehasher MD5 pode ser encontrado neste site: https://www.md5online.org/ .

Para dificultar ataques de força bruta a hashes, um sal pode ser administrado. No php, você pode usar password_hash()para criar um hash de senha. A função password_hash()cria automaticamente um sal. Para verificar uma senha em um hash de senha (com sal), use password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

Uma senha pode ser representada por mais de um hash. Quando você verifica a senha com diferentes hashes de senha usando password_verify(), a senha será aceita como uma senha válida.

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




Uma função 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


Criptografia em PHP

Vamos mergulhar em algum código PHP que lida com criptografia.

--- A extensão Mcrypt ---

CRIPTOGRAFAR:

$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)

Descriptografar:

$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)

--- A extensão OpenSSL ---

A extensão Mcrypt foi preterida na 7.1. e removido no php 7.2. A extensão OpenSSL deve ser usada no php 7. 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)
Julian
fonte
Observe que o PHP mcrypt já está obsoleto (talvez eu tenha algo a ver com isso) e que SHA-1, MD5 e ECB são considerados inseguros. nãoA_KEY é uma chave AES / Rijndael-128; é uma senha, não um aliado.
Maarten Bodewes
@MaartenBodewes Sim, isso é verdade. O OpenSSL é a moda agora. php.net/manual/pt/book.openssl.php
Julian
10

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 porque duas chaves são usadas: uma para criptografia e outra para descriptografia. O algoritmo de criptografia assimétrica mais comum é RSA.

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

insira a descrição da imagem aqui

Hashing:

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

insira a descrição da imagem aqui

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

Vahid Farahmandian
fonte
Desculpe, sou um novato em segurança, mas você pode explicar o significado de "normalmente empregado para proteger dados de carga útil"?
Abdul
2
A criptografia @Abdul Asymmetric possui alta carga computacional, portanto não é usada para proteger os dados que são enviados por uma rede como pacotes (carga útil). Em vez disso, é usado para estabelecer uma conexão de rede segura usando a troca de chaves públicas para proteger os dados.
Sorte
5
  1. Use hashes quando você só precisa seguir um caminho. Por exemplo, para senhas em um sistema, você usa o hash porque só verificará se o valor digitado pelo usuário, após o hash, corresponde ao valor do seu repositório. Com a criptografia, você pode seguir dois caminhos.

  2. algoritmos de hash e algoritmos de criptografia são apenas algoritmos matemáticos. Portanto, nesse aspecto, eles não são diferentes - são apenas fórmulas matemáticas. No que diz respeito à semântica, no entanto, existe uma grande distinção entre hash (unidirecional) e criptografia (bidirecional). Por que os hashes são irreversíveis? Porque eles são projetados para serem assim, porque às vezes você deseja uma operação unidirecional.

hvgotcodes
fonte
4

Os algoritmos de criptografia e hash funcionam de maneiras semelhantes. Em cada caso, é necessário criar confusão e difusão entre os bits. Em resumo, a confusão está criando um relacionamento complexo entre a chave e o texto cifrado, e a difusão está espalhando as informações de cada bit.

Muitas funções de hash realmente usam algoritmos de criptografia (ou primitivas de algoritmos de criptografia. Por exemplo, o candidato SHA-3 Skein 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 destrutivos, deterministicamente mesclados em um comprimento fixo

Justin Morgan
fonte
4

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

Quando se trata de autorização, você usa o hash. Não há chave no hash.

O hash usa qualquer quantidade de dados (binário ou texto) e cria um hash de comprimento constante que representa uma soma de verificação para os dados. Por exemplo, o hash pode ter 16 bytes. Algoritmos de hash diferentes produzem hashes de tamanhos diferentes. Obviamente, você não pode recriar os dados originais a partir do hash, mas pode hash os dados novamente para ver se o mesmo valor de hash é gerado. Senhas unidirecionais baseadas em Unix funcionam dessa maneira. A senha é armazenada como um valor de hash e, para efetuar logon em um sistema, a senha digitada é hash e o valor do hash é comparado com o hash da senha real. Se eles corresponderem, você deve ter digitado a senha correta

por que o hash é irreversível:

O hash não é reversível porque o mapeamento de entrada para hash não é 1 para 1. Ter duas entradas mapeadas para o mesmo valor de hash é geralmente chamado de "colisão de hash". Por motivos de segurança, uma das propriedades de uma função de hash "boa" é que as colisões são raras em uso prático.

ayush
fonte
1
"O hash não é reversível porque o mapeamento de entrada para hash não é 1 para 1". Obrigado, acho que esse é um fator muito importante quando se trata de diferenciar hashes de criptografadas! :)
Kenny Cason
Isso não distingue claramente entre funções hash normais, funções hash criptográficas e hashes de senha. Todos esses têm propriedades diferentes.
Maarten Bodewes
-2

A 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 tela, a música que você ouve através do fone de ouvido, tudo é binários. Mas nossos ouvidos e olhos não entenderão binários, certo? Somente o cérebro poderia entender isso e, mesmo que entendesse binários, não pode desfrutar de binários. Assim, convertemos os binários em formatos humanos compreensíveis, 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

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

Se o valor original não puder ser recuperado, onde usamos isso? Senhas! Quando você configura uma senha para o 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 misturada com o mesmo algoritmo (função de hash) e a saída é correspondida com o valor armazenado. Se for o mesmo, você será logado. Caso contrário, será expulso.

Créditos: wikimedia Aplicando hash à senha, podemos garantir que um invasor nunca receberá nossa senha, mesmo que ele roube o arquivo de senha armazenado. O invasor terá o hash da senha. Ele provavelmente pode encontrar uma lista das senhas mais usadas, aplicar sha-512 a cada uma delas e compará-la com o valor em sua mão. É chamado de ataque de dicionário . 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 são hash, ou pelo menos deveriam ser hash.

Depois, há criptografia

A criptografia está entre o hash e a codificação. A codificação é um processo bidirecional e não deve ser usado 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 a criptografia funciona, não se preocupe, discutiremos o básico aqui. Isso seria suficiente para entender o básico do SSL. Portanto, existem dois tipos de criptografia, a saber, criptografia simétrica e assimétrica.

Criptografia de chave simétrica

Estou tentando manter as coisas o mais simples possível. Então, vamos entender a criptografia simétrica por meio de um algoritmo de deslocamento. Esse algoritmo é usado para criptografar alfabetos deslocando as letras para esquerda ou 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 em 3 lugares. Aqui, a palavra CRYPTO é chamado Plaintext , o FUBSWR saída é chamado o texto cifrado , o valor 3 é chamado de criptografia de chave (chave simétrica) e todo o processo é uma cifra. Este é um dos algoritmos de criptografia de chave simétrica mais antigos e básicos e seu primeiro uso foi relatado durante o tempo de Júlio César. Então, foi nomeado após ele e é o famoso Caesar Cipher . Qualquer pessoa que conheça a chave de criptografia e possa aplicar o inverso do algoritmo de César e recuperar o texto sem formatação 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. Depois que essa chave é roubada, todos os dados desaparecem. Esse é um risco enorme e precisamos de uma técnica mais complexa. Em 1976, Whitfield Diffie e Martin Hellman publicaram 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 chave pública e a outra é a chave privada . Teoricamente, durante a iniciação, podemos gerar o Público-Privadopar de chaves para a 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, quem tem sua chave pública pode 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 de sua propriedade.

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

Ornitorrinco Anônimo
fonte
-3

Criptografia O objetivo da criptografia é transformar dados, a fim de mantê-los em segredo. Por exemplo, (enviar a alguém um texto secreto que somente eles possam ler, enviar senhas pela Internet).

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

Criptografa os dados para outro formato, transformando-os em um padrão único. Podem ser criptografados com a chave secreta e os usuários que possuem a chave secreta podem ver a mensagem, revertendo o processo. Por exemplo (AES, PEIXE, RSA)

A criptografia pode simplesmente se parecer com esta FhQp6U4N28GITVGjdt37hZN

Hashing Em tecnicamente, podemos dizer que ele recebe uma entrada arbitrária e produziu uma string de comprimento fixo.

O mais importante é que você não pode ir da saída para a entrada. Isso produz uma saída forte de que as informações fornecidas não foram modificadas. O processo é pegar uma entrada e hash e, em seguida, enviar com a chave privada do remetente assim que o destinatário receber, eles podem validá-la 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 .....)

neevan
fonte