Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
January 22, 2022 10:34 pm GMT

Encoding, Hashing e Encryption: Qual a diferena?

Encoding, hashing e encryption so conceitos comuns aplicados e discutidos ao tentar proteger os dados. Muitos devs afirmam usar mtodos e padres de criptografia fortes, mas necessrio que uma equipe de segurana avalie se realmente apropriado.

Vamos dar uma olhada nas diferenas entre o uso adequado de encoding, hashing e encryption.

Encoding

Encoding(codificar) algo comunic-lo de uma maneira que o receptor entenda. Existem muitos padres de codificao, como por exemplo, Base64, UTF-8 e ASCII. Cada padro tem uma finalidade e as aplicaes que usam esses padres de codificao esperam receber dados compatveis com esse padro de codificao.

Uma comparao fcil a linguagem humana. As palavras, sintaxe e regras da linguagem so diferentes e nicas para cada cultura lingustica. Um nativo de portugus pode no ser capaz de ler ou falar japons, mas com o tradutor adequado, ele pode decodificar o japons para o portugus e at codificar o portugus para o japons usando um tradutor.

As duas linhas a seguir representam os mesmos dados:

Texto: Esta linha tem dados secretos que voc realmente deve codificar.
Base64: RXN0YSBsaW5oYSB0ZW0gZGFkb3Mgc2VjcmV0b3MgcXVlIHZvY8OqIHJlYWxtZW50ZSBkZXZlIGNvZGlmaWNhci4=

Para os olhos humanos, essas duas linhas so totalmente diferentes. Para uma aplicao, elas so iguais.

Se voc codificar diversas vezes os mesmos dados, o encode gerado ser o mesmo valor, caso mude uma vrgula, ir mudar tudo.

A codificao de dados normalmente usada para garantir a integridade e usabilidade dos dados e na maioria das vezes usada quando os dados no podem ser transferidos em seu formato atual entre sistemas ou aplicaes.

A codificao no usada para proteger dados, porque fcil de reverter.

Qualquer fornecedor que afirme usar criptografia base64 forte em sua soluo suspeito.

Exemplo de cdigo em kotlin:

import java.util.*fun main() {    val mensagem = "Esta linha tem dados secretos que voc realmente deve codificar."    //codifica para base64    val codificarString: String = Base64.getEncoder().encodeToString(mensagem.toByteArray())    println("string codificada: $codificarString")    //decodifica    val decodificarBytes = Base64.getDecoder().decode(codificarString)    val decodificarString = String(decodificarBytes)    println("string decodificada: $decodificarString")}

Hashing

Hashing um mtodo de validao de integridade. O problema que o hashing se prope a resolver no proteger os dados de serem lidos, mas sim validar que os dados em questo no foram alterados.

Os algoritmos de hash so funes unidirecionais que recebem uma entrada e calculam uma nica sada. Os algoritmos de hash so projetados de tal forma que voc no pode pegar um valor de hash e trabalhar o algoritmo de volta para obter a entrada original. Caso haja uma invaso na sua base de hash, o invasor teria que gerar muitas entradas em potencial e comparar a sada com a sada do algoritmo de hash para ver se elas estavam corretas.

Os algoritmos de hash incluem SHA1, SHA256 e SHAKE256, entre outros.

As trs linhas a seguir representam os mesmos dados:

Texto: Esta linha tem dados secretos que voc realmente deve criptografar.
MD5: ca37111d05a53346b2c14d749e4c4191
SHA1: f6472fbf25720494e4d02d0ec2c94aacee34d602

Hashing nunca deve ser revertido. Ele no deve ser usado para impedir que as comunicaes sejam lidas por partes no autorizadas.

Um uso comum de hash para proteger o armazenamento de senhas. Quando um usurio cria uma senha, a senha colocada por meio de um algoritmo de hash. O hash resultante ento armazenado. Quando um usurio tenta se autenticar, a senha criptografada novamente e comparada com o hash armazenado.

Novamente, o hash uma verificao de integridade. No criptografia.

Exemplo de cdigo em kotlin:

import java.math.BigIntegerimport java.security.MessageDigestfun main() {    val input = "Esta linha tem dados secretos que voc realmente deve criptografar."    val md5 = input.md5()    println("o hash do md5  $md5")    val sha1 = input.sha1()    println("o hash do sha1  $sha1")}fun String.md5(): String {    val md = MessageDigest.getInstance("MD5")    return BigInteger(1, md.digest(toByteArray())).toString(16).padStart(32, '0')}fun String.sha1(): String {    val md = MessageDigest.getInstance("SHA-1")    return BigInteger(1, md.digest(toByteArray())).toString(16).padStart(32, '0')}

Encryption

A Encryption(criptografia) torna os dados ilegveis por qualquer pessoa, exceto aqueles que conhecem a secret key(chave secreta). O segredo pode ser uma nica shared key(chave compartilhada) ou pode ser dividido em duas chaves - uma mantida privada e outra fornecida outra parte.

Digamos que Quinn e Gary desejam se comunicar com segurana. Eles decidem usar uma shared key(chave compartilhada) de chookity para seu segredo. Ao criptografar uma mensagem, Quinn insere a chave de criptografia. Ao descriptografar a mensagem, Gary digita a chave para poder ler a mensagem.

Quinn e Gary, no entanto, esto preocupados com o fato da mensagem secreta ser lida por um terceiro que possa adivinhar ou obter essa chave. Eles decidem usar um sistema de duas chaves (criptografia de chave assimtrica - asymmetric key encryption) para criptografar as mensagens. Quinn quer enviar uma mensagem que somente Gary pode ler. Quinn usa uma chave (chave pblica - public key) que Gary deu a ela com antecedncia. Gary recebe essa mensagem criptografada e usa sua outra chave (chave privada - private key) para descriptografar e ler essa mensagem. Como apenas Gary conhece sua chave privada e nunca a compartilhou com ningum, ningum pode descriptografar a mensagem, exceto Gary. Gary tambm usa sua chave privada para enviar uma mensagem para Quinn e Quinn pode usar a chave pblica que Gary deu a ela para l-la. Esse tipo de criptografia conhecido como signing(assinatura). Como a chave pblica que Gary deu a Quinn descriptografou a mensagem, Quinn pode presumir com segurana que Gary enviou a mensagem, pois apenas Gary tem a outra chave desse par.

Algoritmos de criptografia fortes comuns incluem: AES, Blowfish e RSA.

Concluso

Encoding, hashing e encryption podem ser usados juntos. Uma mensagem codificada em base64 para uma aplicao pode ser hash para que a integridade dessa mensagem possa ser verificada pelo receptor. A mensagem pode ento ser criptografada e enviada para o destinatrio que ir descriptografar e comparar o hash da mensagem com o valor de hash recebido do remetente para garantir que a mensagem no foi alterada.

Compreender a diferena entre esses conceitos pode ajud-lo a considerar o design e a arquitetura de segurana, especialmente quando se trata de aquisio ou reviso de aplicaes. Implementar acidentalmente a codificao como um mtodo de criptografia pode ser muito perigoso para uma organizao, pois isso significaria que as transmisses so dados reais que podem ser facilmente decodificados por qualquer pessoa, ento tomem cuidado senhores & senhoras


Original Link: https://dev.to/kotlinautas/encoding-hashing-e-encryption-qual-a-diferenca-29gg

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To