Vejo muita confusão entre hashes e algoritmos de criptografia e gostaria de ouvir mais alguns conselhos de especialistas sobre:
Quando usar hashes vs criptografias
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
security
encryption
hash
cryptography
Kenny Cason
fonte
fonte
Respostas:
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
a
eb
a partir da seguinte fórmula:10 = a + b
. Existem 10 combinações positivasa
eb
que 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 queFunçõ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, produzmd5(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 é:
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 :
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).Agora,
hash1
tem uma probabilidade de colisão de 0,001%. Mas quando fazemos o próximohash2 = sha1(hash1);
, todas as colisões dehash1
automaticamente se tornam colisões dehash2
. Então, agora, temos a taxa de hash1 em 0,001%, e a segundasha1()
chamada aumenta isso. Então agora,hash2
tem uma probabilidade de colisão de 0,002%. Isso é duas vezes mais chances! Cada iteração adicionará outra0.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 commd5
é 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:
Tem a mesma chance de colisão que a
sha512
função nativa . Qual é o que você quer. Use isso em vez disso.fonte
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.
fonte
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:
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.
Assim como o exemplo simples de hash, esse tipo de criptografia tem sido usado historicamente .
fonte
Visão geral básica das técnicas de hash e criptografia / descriptografia.
ATUALIZAÇÃO: Para abordar os pontos mencionados na pergunta editada.
fonte
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ê.
fonte
Uma função Hash transforma uma quantidade de texto de tamanho variável em um texto de tamanho fixo.
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:
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çãopassword_hash()
cria automaticamente um sal. Para verificar uma senha em um hash de senha (com sal), usepassword_verify()
.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.Uma função de criptografia transforma um texto em um texto cifrado sem sentido usando uma chave de criptografia e vice-versa.
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:
Descriptografar:
--- 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:
fonte
A_KEY
é uma chave AES / Rijndael-128; é uma senha, não um aliado.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.
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.
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
MD5
eSHA-1
.Leia mais aqui: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/
fonte
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.
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.
fonte
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
fonte
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.
fonte
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/ )
fonte
fonte