Criptografia na Prática - Certificados, BitTorrent, Git, Bitcoin

73.9k views12613 WordsCopy TextShare
Fabio Akita
Como que se geram chaves secretas pra encriptação? Pra que servem pares de chaves? Como certificados...
Video Transcript:
Olá pessoal Fábio aquita criptografia é um assunto super extenso e hoje eu quero mostrar um pouco mais na prática alguns componentes que vocês vão esbarrar mais cedo ou mais tarde eu já tinha feito dois vídeos sobre a teoria depois assistam eu não sou especialista em segurança eu sou um desenvolvedor que se interessou pelo assunto e só por isso não considerem que tudo que eu vou falar é o único jeito ou é completo é apenas o que eu considero o mínimo de desenvolvedor para desenvolvedor quem for especialista na área Por favor complementem nos comentários abaixo quem
evitou o assunto até agora hoje é dia de cair de cabeça eu quero mostrar como encriptação de dados funciona como os certificados digitais funcionam e como tudo isso é aplicado no mundo real passo a passo na segunda metade eu vou explicar como um bit torrent funciona e quais tecnologias tornam ela similar a um Git vamos lá esse é um vídeo para quem já saiu da faculdade mas ainda não brincou o suficiente com criptografia infelizmente você vai precisar ter um mínimo de base para prosseguir e dessa vez eu não vou segurar muito na mão prestem bastante
atenção façam anotações se precisar se não entenderem esse começo não vão conseguir seguir o raciocínio depois pausem voltem revejam até entender a primeira metade vale até abrir o terminal e tentar os comandos vocês mesmos para sentirem na mão como funcionam vídeos densos como de hoje não é para assistir só uma vez toda CPU moderna tem instruções em hardware para encriptar dados se você tem Mac e habilitou file volt se tem Windows e habilitou bitlocker ou se usa Linux com Lux Todos usam o algoritmo de encriptação AES provavelmente a variante de 256 bits em cpus novas
É muito raro sentir que o sistema ficou muito lento por causa disso por isso recomendo manter ativado especialmente em notebooks caso sejam Roubados a chance de alguém acessar seus dados é perto de zero se quiser aumentar performance o certo não é desligar a encriptação e sim comprar um SSD melhor há quem ainda acha que só porque precisa fazer login na sua conta quando liga a máquina tá seguro mas não se remover o HD ou SSD do seu notebook e ligar numa outra máquina eu vou ter acesso a todos os arquivos se não tiver encriptado seu
login e senha não fazem nenhuma diferença login em sistema operacional só evita que um usuário tenha acesso aos arquivos de outro usuário enquanto a máquina tá ligada e ninguém tem acesso físico ao hardware se tiver acesso físico não faz diferença isso vale para qualquer sistema operacional no episódio de sua segurança é uma droga eu demonstrei o uso do veracrypt diferente de bitlocker do Windows por exemplo que só dá suporte a Eis Porque é o mais performático o veracrypt permite escolher outros algoritmos para coisas muito grandes vai ser mais lento mas por outro lado é o
mais seguro um HD com bitlocker pode ser difícil de quebrar Mas sabendo que é eis podemos focar só nisso mas uma imagem encriptada com Vera cript não sabemos nem o algoritmo usado e isso aumenta a segurança exponencialmente por isso que para coisas absolutamente críticas é melhor usar Vera crypt pro dia a dia Eis de bitlocker ou file volt é mais que suficiente eu vou repetir se você tem Dados importantes no notebook que carrega embaixo do braço para trabalhar de um Starbucks da vida eu espero que não seja burro de andar por aí sem encriptação Mas
como que funciona esse tipo de encriptação vamos dar alguns exemplos um dos pacotes de segurança e que pitografia mais conhecidos e utilizados do mundo é o famoso Open SSL é um pacote gigante com Praticamente tudo que se precisa para lidar com criptografia existem outras alternativas como libre SSL boring SSL do Google NSS da Mozilla e outros mas eu vou focar no open SSL porque ainda é um dos mais usados de um terminal no Linux é assim que podemos gerar uma chave aleatória vamos chamar de key.bin geramos uma chave binária de 32 bytes ou 256 bits
essa Chave É seguro o suficiente pra maioria dos usos hoje para ser mais seguro deveríamos adicionar entropia externa por exemplo com um hardware externo ou o chip de TPM que vem em máquinas modernas usando algo como tpm2 tss entropia Inicial é extremamente importante para definir a força de uma chave mas só para usar de exemplo isso já vai servir por ser importante vale mais uma tangente tudo em criptografia Depende de um prng ou pseudo Random number generat não existe número verdadeiramente aleatório existem funções que dado um número Inicial consegue ir cuspindo números que parecem aleatórios
Se colocarmos numa distribuição estatística seria uniforme onde todos os números têm mais ou menos as mesmas chances de aparecer sem nenhum viés aparente mais do que isso os números gerados não devem parecer diferentes de aleatoriedade verdadeira devem ser resistentes a backtracking não deveria ser possível reconstruir números anteriores só vem numa sequência de números gerados ou seja devem ser resistentes à previsão não podendo ser fácil prever os próximos devem ser difíceis ou impossíveis de serem reproduzidos bons números aleatórios são fornecidos pelo sistema operacional no caso de Linux existe um dispositivo em barra Dev bar Random que
é de onde pacotes como OB SSL se conectam podemos aumentar a entropia dele usando um serviço como rngd num Arc é só instalar com PCM TR su s rngd habilitar e iniciar com System CTL enable e System CTL start esse serviço vai tentar puxar entropia de dispositivos de hardware ou do chip TPM do seu PC se ele for moderno chip TPM de trusted platform module é o que gerou controversa quando Windows 11 inicialmente ia obrigar todo mundo a ter no fim voltaram atrás porque muita gente não ia ter e reclamaram muito mas o certo é
realmente ter esse chip toda placa mãe tem um slot para esse chip mas em modelos baratos ele vem vazio para você comprar separadamente dentre as várias funções de segurança que ele fornece tá entropia via hardware esse serviço rngd vai alimentar o Barra Dev barra Random que por sua vez é usado pelo Open SSL várias classes de malware e vírus são bloqueados ao ter um chip TPM devidamente configurado em particular root kits além de melhorar a encriptação com bitlocker cheque se sua máquina tem ou se tem suporte de instalar se tiver compre e instale todo Mac
e iPhone tem um chip similar instalado de fábrica o chip T2 que é uma das razões de um Mac ser mais seguro que um PC mais barato nada disso torna você 100% seguro mas certamente melhora a sua defesa voltando ao exemplo agora eu vou criar um arquivo idiota chamado teste.txt com a boa e velha frase hello world e vamos encriptar usando Nossa chave essa linha de comando de Open CC ele vai usar eis 256 em modo CBC cons passando o teste pon TXT e devolvendo teste.txt pen usando a chave key.bin que acabamos de gerar pronto
se dermos um Cat no novo arquivo vai devolver um lixo binário podemos ver com hax dump e não tem nada a ver mais com o arquivo original Esse é o resultado esperado mais um adendo aqui só para simplificar o exemplo eu escolhi eis 256 em modo CBC ou cipher Block chaining ele é melhor que o anterior icb mas é sensitivo a erros de cipher Text e é vulner ataques de pading oracles se não for implementado corretamente além de CBC existe cypher feedback ou cfb output feedback ou ofb Counter ou CTR igalo a Counter mode ou
dcm se precisar escolher use dcm eu tô usando CBC consult que já é melhor que CBC sozinho mas se for usar dcm ele vai gerar um tag de autenticação e anexar no arquivo encriptado mas o certo é se preocupar com o trá desse tag porque ele precisa ser transportado de forma segura e não no anexo de e-mail aberto por exemplo Além disso tem que se preocupar com initialization vectors ivs por isso a maioria do dos tutoriais por aí assim como o meu exemplo usam CBC porque é mais fácil de explicar entenda isso pareceu que eu
falei uma sopa de letrinhas à toa só para dificultar mas foi para demonstrar que a maioria dos tutoriais vai escolher a opção mais simples de explicar que costuma ser a mais insegura por isso eu falo que se você não estudou criptografia a fundo não deveria tomar decisões de criptografia vai usar errado e vai tornar a encriptação do seu sistema mais inseguro era uma das minhas críticas quando jwt o Jason web authentication Por Exemplo foi lançado lá atrás e ele exigia que o desenvolvedor soubesse tomar essas decisões de algoritmos e modos mas quase ninguém sabe e
nem vai aprender certo ele não deveria permitir as combinações obviamente mais inseguras só que ao fazer isso tornaria usabilidade mais difícil difícil É sempre um tradeoff quanto mais usável tentar fazer alguma coisa mais inseguro vai ser segurança é complicado assim mesmo agora eu poderia enviar o arquivo encriptado para outra pessoa pela internet e se ela tiver a minha chave conseguiria decriptar com uma linha de comando parecido com essa Open SSL modo eis 256 CBC recebendo o teste TXT enk encriptado e descriptografando em teste TXT deck passando a chave k. Bin com o comando Cat vemos
que foi com sucesso bacana de forma simplificada é assim que um bitlocker ou file volt ou Vera cript da vida estaria lidando com seus dados eu digo simplificando porque aqui dei exemplo lidando com arquivos inteiros mas sistemas de arquivo lidam com stream de blocos Enfim no HD físico só teria o equivalente a aquele arquivo teste.txt PN que é a versão encriptada e precisa ter essa chave em algum lugar para conseguir ler o conteúdo original de volta isso normalmente seria pesado de de computar mas a encriptação e decriptação não é feita via software e sim via
instruções direto da CPU em hardware por isso o processo é mais acelerado e quase não sentimos na prática mas no exemplo anterior temos um problema gigantesco se o objetivo de encriptar algum arquivo for para poder enviar de forma segura para outra pessoa como fazemos para enviar a chave de forma segura também a única forma seria essa pessoa vir até minha casa trazendo um pen drive e eu gravar a chave de direto no pen drive sem nunca trafegar pela internet mas isso não é prático como eu consigo passar uma chave para outra pessoa de forma que
ninguém na internet consiga interceptar ou adulterar aqui entra o conceito de Chaves assimétricas novamente eu explico sobre isso em detalhes no segundo vídeo de criptografia mas deixa eu dar um exemplo prático de volta ao terminal vamos usar Open SSL para gerar um par de Chaves literalmente são dois arquivos um chamado Private ppen e outro chamado Public pen enfim eu escolhi a opção de algoritmo RSA de 2048 bits e eu sei que já deve ter gente indo nos comentários reclamar por quita Você devia ter usado curva elíptica em vez de RSA eu expliquei o que são
esses algoritmos e as diferenças no meu vídeo antigo mas Resumindo sim elliptic Curve cryptography ou ecc é mais forte que RSA uma chave ecc de 256 bits é mais forte que uma chave RSA de 372 bits mais de 10 vezes o tamanho O problema é que Open SSL não oferece comandos simples para encriptar dados arbitrários com Chaves ecc porque ICC é normalmente usado para coisas como tráfego de Chaves ou ecdh assinatura digital que é ecdsa ou com mecanismos de encapsulamento de Chaves em ecies ou seja não é simples para sair encriptando qualquer dado arbitrário Eu
poderia usar ecdh mas a ideia desse vídeo não é entrar nas minúcias de ecc e sim dar uma noção Geral de de criptografia e para esse fim RSA vai ser mais que suficiente RSA é mais simples para usar e ensinar mas se estiverem fazendo algo sério estudem tudo que eu acabei de falar sobre ICC e o que são esses arquivos RSA que foram gerados podemos usar o comando Cat e vai listar o conteúdo é a versão em base 64 da chave binária base 64 é como encod um binário em caracteres Ask que dá para mostrar
na tela convertemos 8 bits em 7 bits por isso ele f um pouco maior o Private ppen é mais longo e o Public ppen é mais curto Olhem só arquivos.pen significa privacy enhanced mail que é um formato de arquivo texto exatamente como dessas Chaves que eu acabei de mostrar é isso um arquivo que começa com esses eens begin lá embaixo termina com end E no meio éum algum binário formatado com base 64 se usa SSH você já gerou Chaves nesse formato as chaves pública e privada geradas com os comandos op SSL pq e Open CSL
RSA estão relacionadas por meio do algoritmo de criptografia RSA o processo começa a gerando dois números primos enormes e aleatórios esses números primos são mantidos em segredo e são a base da segurança do sistema em seguida esses números primos são multiplicados entre si resultando em um número chamado módulo esse módulo é usado na criação de ambas as chaves a chave pública é derivada do módulo e de um expoente público que é um número pré definido e geralmente pequeno a chave Pública pode ser compartilhada com qualquer pessoa e é usada para criptografar mensagens que só podem
ser descriptografados pela chave privada correspondente por outro lado a chave privada é gerada usando os números primos originais e um expoente privado calculado a partir deles a chave privada é mantida em segredo e é usada para descriptografar as mensagens criptografadas Pela chave pública embora as chaves pública e privada não sejam os números primos em si elas são matematicamente relacionadas aos números primos utilizados durante a geração esse relacionamento matemático é fundamental para o funcionamento da criptografia RSA e é o que permite a comunicação segura onde informações criptografadas com a chave pública só podem ser lidas Pela
chave privada correspondente e vice-versa E aí fodeu não entendeu nada né Vamos simplificar com um exemplo eu digito o comando op SSL pedindo para minha chave key.bin usando a chave pública e resultando no novo arquivo .bin.enc Pronto agora temos a chave simétrica original encriptada usando a nova chave pública se listarmos o conteúdo com hex dump veja como os binários são diferentes para não ficar confuso Vamos recapitular eu gerei uma chave simétrica eis chamada i. Bin eu quero usar essa chave para criptografar arquivos ou mensagens para mandar para uma segunda pessoa em em algum lugar na
internet vamos chamar de John porém não adianta criptografar a mensagem e mandar pro John porque el precisa ter a chave mas eu não posso mandar a chave via e-mail ou WhatsApp Porque aí não tem segurança nenhuma precisamos garantir que nada no meio do caminho possa interceptar ou adulterar minhas mensagens pro John o problema de mandar a chave direto por e-mail é se alguém na internet vamos chamar de Skynet intercepte essa comunicação e fique com minha chave sem passar pra frente daí ela manda uma outra a chave falsificada pro John o John não sabe que recebeu
uma chave falsa agora eu Fábio Vou mandar uma mensagem criptografada com minha chave que diz John eu descobri a localização da Skynet tá nas coordenadas XY a Skynet intercepta essa comunicação e como já tinha interceptado a minha chave consegue facilmente abrir a mensagem agora ela forja uma segunda mensagem dizendo John achei a Skynet clique neste link para ver a localização grafa com a chave falsa e manda pro John o John abre achando que veio de mim daí na confiança clica no link e é isso Acabou a raça humana game over eu sempre digo nunca saia
clicando em links que recebe por e-mail ou WhatsApp mas eu sei que isso poderia acontecer em vez disso eu já tinha ensinado pro John cria um par de Chaves RSA e manda a chave pública para mim mas nunca jamais transmita a chave privada para fora da sua máquina ele me manda a chave pública por e-mail é aberto mesmo e com essa chave eu encripta aquele arquivo k. bin Quando o John receber a mensagem criptografada pode rodar o seguinte comando Open SSL decriptar o arquivo .bin.enc com a chave privada dele entenda quando eu encrypto alguma coisa
com a chave pública do John o único que vai conseguir abrir é o John com sua chave privada Se eu conseguir passar minha chave simétrica k pon bim para ele de forma segura garantidamente só nós dois temos o segredo e podemos começar a trocar comunicação encriptada com e e a Skynet não vai ter como interceptar nem ficar no meio do caminho tentando forjar mensagens mas tem um pequeno defeito nesse processo como eu sei que a chave pública que o John me mandou veio realmente do John e não é de novo a da Skynet tentando me
enganar Esse é o mesmo problema que temos hoje em websites e e-commerces da vida como que eu sei que a chave pública que eu recebi da amazon É realmente da Amazon como eu sei que não é um site de um hacker uma Skynet tentando se passar pela Amazon vamos entender a última peça que falta a autoridade certificadora esse é o princípio por trás de SSL ou mais corretamente tls que todo navegador utiliza o que acontece por trás dos pano sem você ver é o seguinte primeiro abrimos o navegador e digitamos https amazon.com davida importante que
seja um site https então o navegador Pede uma conexão segura pro servidor web da Amazon que por sua vez de devolve Um certificado digital Um certificado digital é um pacote que contém a chave pública a metade do par de Chaves de uma Amazon a chave privada nunca sai do Servidor lembre-se desse conceito Chaves privadas nunca podem tocar internet jamais Mas como eu posso garantir que não é Skynet minha conexão foi interceptada e eu recebi um certificado falso para isso existem C ou certificate authorities vamos ilustrar com um exemplo Porque é importante desse processo na cabeça
de novo o objetivo do vídeo não é ser um tutorial mas se nunca viu eu vou criar um novo certificado digital usando o serviço Lets and cript associado ao meu domínio válido aquit and.me para criar um certificado precisa ter um domínio registrado válido o jeito tradicional é um passo a passo Super Chato é um processo já bem documentado que tem dezenas de lugares só procurar no Google mas Lets encrypt é mais fácil porque simplifica vários passos para começar precisa ter instalado o programa CT boot na sua máquina e iniciamos o processo pedindo para gerar um
certificado pro meu domínio usando o método de checar um registro no DNS para garantir que sou mesmo o dono desse domínio só quem é dono do domínio consegue configurar o name server no caso ele gera o que chamamos de um challenge Um Desafio que é esse número aleatório aqui eu tenho que registrar um campo TXT no DNS do domínio com Exatamente esse número isso não é uma senha fica aberto mesmo é só para garantir que a pessoa pedindo para gerar o certificado realmente é o dono do domínio no meu caso meu DNS ou name server
tá naws então eu abro o route 53 para editar os registros do meu domínio aquando PME dependendo de onde tá seu domínio vai ser uma tela diferente mas o princípio é o mesmo daí tem que esperar alguns minutos para essa informação replicar pela internet se não sabe como isso de DNS funciona não deixa de ver minha série sobre redes eu já expliquei isso lá uma vez validado vamos ganhar dois arquivos gravados em bar etc barlet encrypt barli bar.me um chamado fullchain.pem o certificado digital propriamente dito que vai ser servido para todo o navegador que conectar
no meu servidor web e o privkey ppen que é a chave privada que jamais deve sair do meu servidor nem ser transmitido pela internet de nenhuma forma eu tô repetindo para vocês nunca esquecerem chave privada se chama privada por uma razão se perder essa chave privada qualquer um pode se passar por você e se alguém ficou pensando Mas e se realmente eu perder essa chave e a solução é imediatamente gerar um novo certificado e Substituir eu não instalei de verdade essa chave porque não tem o site nesse domínio mas se tivesse no seu navegador iria
aparecer o famoso cadeado as informações que aparecem quando clica no cadeado é exatamente o conteúdo desse Arquivo fullchain ppen ele contém a chave pública e Tá assinado por uma ca a central Authority no caso a Lets encrypt eis a resposta de como podemos garantir que o certificado que o site me deu é confiável todo navegador Firefox Safari Ed Chrome opera já vem pré-instalados com vários certificados raiz seja da Cert sign digicert Global sign são arquivos que foram instalados junto com seu navegador ou que seu navegador puxa do próprio sistema operacional um dos dois vai ter
esses certificados Raiz Se baixou seu navegador fora do site oficial num site genérico de downloads não existe garantia nenhuma lá garantia soido Mas se tiver usando o Safari que já veio no seu Mac ou o Ed que já veio no seu Windows a probabilidade é que sejam legítimos de novo se comprou sua máquina usada de um terceiro e nunca formatou não dá para garantir nada nenhuma máquina que não foi você quem instalou ou que não comprou numa loja de verdade não tem nenhuma garantia ponto final podemos abrir diretamente o arquivo full ch.pen e veja só
temos uma cadeia de certificados primeiro o do meu domínio em em seguida vemos que foi assinada pela Lets encrypt que é essa R3 e ela mesma por sua vez é assinada por outra autoridade a digital signature trust Company certificados raiz podem ser instalados com o sistema operacional ou podem vir com os navegadores Google Chrome e outros navegadores baseados em Chromium costumam usar o que tem no sistema operacional Firefox parece que prefere certificados próprios no art Linux como mandaro que eu uso vem no pacote ca certificates e costuma ficar no diretório bar etc bar SSL barcs
Olha só um trecho da listagem dos certificados e se olharmos mais para baixo temos o certificado isrd root X1 que é a raiz que vimos no certificado digital gerado pela Lets encrypt o meu navegador acha o isrg root X1 instalado na máquina ele parte do pressuposto que pode confiar em todos certificado que foi assinado por qualquer autorizada abaixo dela é uma cadeia de assinaturas o certificado do meu domínio akitan PME foi assinado Pela chave privada da Lets encrypt que por sua vez tem um certificado Assinado por essa isrd que é verificado pela digital signature trust
que em última instância foi instalado no meu sistema operacional em última instância confiamos que o sistema operacional não foi adulterado porque instalamos com o ISO oficial ou já veio pré-instalado de fábrica e a máquina é nova quando fizemos o processo do CT boot ele gerou aquele full ch.pen começou gerando o par de Chaves pública e privada daí empacotou no certificado que é uma estrutura de dados com informações como o nome do domínio e-mail chave pública etc é só um arquivo como se fosse um Jason da vida por exemplo mas num formato específico de certificado no
final ele gera a impressão digital desse arquivo que é um hash usando um algoritmo como shad 256 da vida impressão digital é outro nome para um hash quando passamos um arquivo ou algum conteúdo por um algoritmo de hashing O resultado é uma impressão digital porque se alterarmos um bit que seja do arquivo original e refizer o hashing O resultado vai ser completamente diferente daqui a pouco eu vou voltar no tema de hashing por enquanto entenda que hashing serve para identificar exatamente o conteúdo original de qualquer coisa e o que chamamos de assinatura digital é o
hash via a chave privada de alguma autoridade vamos em outro exemplo youtube.com Olha o cadeado aqui no navegador se abrirmos vemos que a raiz é um tal de GTS root R1 voltando lá pro diretório bar etc barss barcs achamos o arquivo do certificado e abrindo podemos ver que se trata do Google trust Services llc uma empresa do próprio Google dedicado só a gerenciar esse certificado raiz o Google sendo gigante é do interesse dela ter controle sobre uma autoridade certificadora também sim o seu computador automaticamente acredita em tudo do Google Existem várias implicações éticas nesse tipo
de coisa mas não é o escopo desse vídeo com isso o navegador sabe que o certificado do site é válido daí ele pode pegar a chave pública de dentro do certificado e usar para encriptar uma chave simétrica isso estabelece o que se chama de conexão segura falando assim da impressão que passamos a usar sei lá um cabo de rede especial que é mais seguro ou algo assim né mas não nada mudou estamos na mesma rede física que antes a diferença é que conseguimos comunicar de forma segura encriptando todos os pacotes e a partir daqui tudo
que o navegador mandar pro servidor e vice-versa vai ser encriptado com essa chave tudo isso é feito para garantir que ninguém no meio do caminho nem uma Skynet nem o provedor nem ninguém consiga ver o que tá sendo trafegado porque vai tudo encriptado esse embr goglio todo de cadeias de certificados assinaturas digitais pares de Chaves assimétricas é a implementação de um triângulo de confiança segurança é quando quando eu e o John temos confiança no mesmo terceiro que é uma autoridade reconhecida por ambos para haver confiança sempre precisa haver um terceiro elemento que ambos os lados
Confiam voltando pra pergunta original Como eu posso confiar na chave pública do John como eu sei que não é Skynet me mandando uma chave falsificada se passando pelo John e a resposta é porque tanto minha máquina quanto a do John Foram configuradas pela primeira vez pela mãe dele mãezona Sara Conor se certificou de instalar um certificado dela em ambas as máquinas quando o joh me mandar o certificado dele Basta ver se tá assinado pelo certificado da Sara e eu vou saber isso porque eu também tenho o certificado de ca dela na minha máquina igual o
exemplo do Google que eu mostrei E com isso a humanidade ainda tem chances contra Skynet para finalizar essa parte já vimos Como usar o certbot para gerar um novo certificado digital assinado pela Lets encrypt pronto para colocar no meu servidor web Mas eu posso já usar usar aqui mesmo no terminal para isso podemos usar op SSL para extrair a chave pública que tá dentro desse certificado pelo terminal como eu tô mostrando Open SSL passando x509 que é o formato de um certificado passando o arquivo de certificado e mandando extrair a chave pública para esse arquivo
pubkey.pem podemos dar catch nesse arquivo e voar lá Eis o base64 da chave tendo a chave pública para encriptar uma mensagem qualquer como a chave simétrica aqui ponto bin do começo do vídeo é só usar o pssl Como já mostrei antes mas tem um porém não vai dar para mostrar isso porque essa chave pública que eu extraí do certificado gerado pelo CT boot é uma curva elíptica ICC lembram por que que eu usei RSA no começo lá atrás porque Open SSL não consegue encriptar uma mensagem qualquer com ICC foi o motivo todo de porque eu
fiz um exemplo com RSA diferente do exemplo de encriptar uma chave simétrica diretamente usando a chave pública RSA com curva elíptica num navegador o que acontece é outro processo chamado de Key Exchange ou troca de Chaves um método popular é usando o método de dif helman que eu já expliquei no meu vídeo antigo de criptografia ou ecdh que é a variante paraa curva elíptica mas tá fora do escopo desse vídeo explicar os detalhes então pesquise mais sobre esse CDH depois Em resumo o navegador já tem implementado um processo só para trocar Chaves simétricas usando Chaves
assimétricas não precisa fazer na mão como eu tô mostrando no terminal curva elíptica mais eficiente e mais sofisticado do que RSA antigo mas RSA é suficiente e mais fácil para demonstrar passo a passo no terminal o objetivo do vídeo não é tornar ninguém aqui especialista em criptografia só molhar os dedos para vocês mesmos irem atrás procurar as formas mais avançadas também não é o objetivo do vídeo explicar a arquitetura de segurança de aplicações web eu só usei o exemplo de tls para explicar a utilidade de Chaves assimétricas muita gente ainda tem na cabeça a imagem
de que criptografia é meramente uma única chave super secreta longa ou até como nos filmes mostra uma chave Física mesmo quem assistiu o último Missão Impossível eles passam o filme todo literalmente atrás de uma chave dividida em duas não é assim que funciona a parte de Chaves Mas enfim agora precisamos estar na mesma página sobre outro conceito importantíssimo impressões digitais ou fingerprints e assinatura digital nova novamente eu não vou detalhar o que eu já expliquei no primeiro vídeo de criptografia entenda assim existem diversas funções de hashing como o x 512 que é um dos mais
usados Existem algumas que já são sabidamente defeituosas e fracas como o antigo md5 o md5 não deve ser usado para assinatura digital porque não é difícil criar colisões mas não quer dizer que seja inútil dependendo do caso de uso ela ainda é usada xá um é a mesma coisa deve ser evitado a função xá 512 tem esse nome porque indep dependente do que passarmos para ele o resultado sempre vai ser um número binário de 512 bits representado como uma string de 128 caracteres mostrando o binário em formato hexadecimal para ficar mais fácil de conseguir copiar
e colar o texto para demonstração Precisamos do programa xa 512 Sam eu acho que na maioria das distros Linux já vem pré-instalado no caso de distros derivadas de Arc costuma ficar no pacote Core utils vamos pegar aquele arquivo teste. TX que usamos lá atrás e que tinha o conteúdo hello world se fizermos xa 512 Sam teste.txt vai devolver essa string Olha só hello world é super curto mas mesmo assim o resultado do hash é sempre fixo um número de 512 bits vamos editar esse arquivo e fazer uma modificação de nada só adicionar um ponto no
final do arquivo rodamos o mesmo comando x 12 Sam e olha o resultado é um novo hash completamente diferente é essa propriedade que torna hashes importantes comparem o hash de antes e o novo apesar de ter só adicionado um mísero ponto no final os hash são completamente diferentes não tem como dizer que vieram de arquivos tão parecidos e esse é o objetivo por isso eles servem de impressão digital um ser humano lendo um texto mais longo poderia passar batido uma pontuação fora do lugar num documento importante Digamos um contrato um zero fora do lugar pode
significar a diferença entre se comprometer a pagar 100.000 ou 1 milhão de dólares se o contrato tivesse 50 páginas a maioria de Nós seres humanos íamos passar batido mas se o documento original tem uma impressão digital basta passar o novo documento pelo X 512 Sam e ver se o hash continua batendo se bater temos certeza que o documento tá intacto e não foi adulterado porém se o número for diferente sabemos Com certeza que foi adulterado e não pode ser confiado não sabemos onde foi adulterado mas sabemos que foi lembra do episódio anterior sobre recuperação de
dados é assim que um sistema de arquivos como zfs ou Butter FS sabe que um arquivo pode estar corrompido outro exemplo eu vou no site da minha distro favorita mandaro e vou baixar a ISO para instalar é um arquivão de 3.7 GB Digamos que eu fiz o download numa rede pública tipo no aeroporto ou no Starbucks Como eu posso garantir que ninguém interceptou minha requisição e me mandou um arquivão falso daí quando eu for instalar na verdade vai instalar um malware chegando numa rede com fiável como minha casa ou escritório eu posso baixar esse outro
arquivo de texam com extensão P iso.ch 512 agora eu posso rodar o seguinte comando xá 512 S passando esse arquivo de chá e o ISO que eu baixei se devolver Ok é por Tá tudo bem mas o que que ele fez Vamos abrir o arquivo pon ISO p x 512 é um neroz no formato da saída do xá 52 Sam a empresa que faz o mandaro que criou o arquivo de instalação original gerou o X2 e gravou nesse arquivo pra gente podemos simplesmente calcular o x 512 em cima do iso de 3.7 GB com o
comando x 512 Sam igual fizemos com o arquivo do hello world e olha só gerou exatamente o mesmo hash com isso sabemos que nenhum bit dos 3.7 GB veio adulterado se um único bit tivesse sido corrompido no download O hash gerado seria completamente diferente e com isso sabemos que o ISO é válido não é um maware e podemos instalar lembra um dos meus vídeos sobre Git esse stringz não parece com o identificador de um comit Só que no caso de comit é mais curto isso porque Git usa xá um em vez de xá do e56
xá um assim como md5 também não é mais para ser usado Mas é difícil migrar tudo para xá 256 sem quebrar compatibilidade gerar confusão na cabeça de todo mundo por isso não usamos xá 256 ainda mas uma hora Git também deve mudar a razão de não usarmos mais md5 é porque descobriram um bug no seu seu processo que torna razoavelmente fácil gerar colisões ou seja se modificarmos um determinado documento cuidadosamente nos bits certos temos como mudar o conteúdo e no final o md5 vai gerar exatamente o mesmo hash Aí perde o propósito Descobriram que dá
para fazer isso com xa um também mas não é tão trivial mesmo assim não é impossível não é prático mas é estatisticamente possível e isso é suficiente para considerarmos parar de usar dois conteúdos diferentes que geram o mesmo hash chamamos de colisão e mais cedo ou mais tarde colisões acontecem é estatisticamente inevitável mas é muito difícil de controlar a colisão para acontecer exatamente quando queremos num xá 256 ou outra função melhor mas md5 e X1 já sabemos como controlar as colisões adicionar bits extras que dá para ignorar só pro arquivo no final conseguir chegar no
mesmo hash eu explico no vídeo de criptografia sobre hashes usados para não guardar senhas abertas num banco de de dados assistam depois Porque é importante saber disso mas caso não saiba é considerado certificado de estupidez gravar senha dos usuários aberto numa tabela do seu banco de dados também é uma Idiot ticia achar que é esperto e gerar só o rest da senha e gravar numa tabela precisa no mínimo de um solt e tem algoritmos melhores do que outros assista depois para entender o principal é o seguinte quando um determinado conteúdo um arquivo ou documento tem
conteúdo Secreto o certo é encriptar o arquivo inteiro usando um algoritmo como eis com uma chave bem longa e forte mas para diversos usos só para identificar se foi ou não adulterado como um contrato não precisa encriptar o arquivo todo basta encriptar a impressão digital que vai ser mais curta um exemplo disso é o download da ISO do site do manjaro é um desperdício encriptar uma ISO inteira não tem nada secreto dentro é um arquivo público que qualquer um pode baixar e instalar de graça o problema é saber se a ISO baixada não foi adulterada
no meio do caminho para isso tem coisas como o arquivo ponto ISO pon x 512 mas tem um outro arquivo no site deles também olha só eles chamam de assinatura e é um arquivo pon ISO psig não dá para listar porque é um arquivo binário mas é assinatura do hash da ISO o problema de um arquivo pon x 512 é que se baixarmos os dois ao mesmo tempo se a ISO foi adulterado no caminho certamente o x 512 também foi adulterado por isso no exemplo de propósito Eu disse que o cenário é que eu baixei
a is do aeroporto mas quando eu baixei o arquivo pon x 512 foi quando eu cheguei em casa numa rede confiável mas não precisamos confiar na rede para checar essas coisas antes de eu ter saído de casa o certo era já ter instalado o pacote gnupg o famoso dpd que é implementação do padrão Open PDP de Pretty Goody privacy é outro pacote que faz uso do conceito de Chaves assimétricas como no exemplo de tls com RS curva elíptica lembram Chaves públicas e privadas só que no exemplo anterior estávamos lidando com certificados ppen para servidores web
GPG é similar mas para identificar pessoas e não servidores tendo o GPG instalado no meu caso que uso mandaro eu já teria que ter baixado as chaves GPG da equipe do mandaro só fazer o download do arquivo com wget e instalar com dpd assim lembra o conceito que o sistema operacional ou navegador já trazem certificados raiz de autoridades certificadoras aqueles arquivos em bar etc bar SSL barc o conceito é parecido esse arquivo manjaro.iso do mandaro tudo que a equipe de lá assinar teríamos como checar agora então eu já fiz isso em casa agora eu tô
no aeroporto e resolvi baixar a ISO do manjaro uma rede pública é o oposto de confiável por isso recomendamos sempre usar VPN mas Digamos que eu não tô numa VPN e ainda Ainda assim eu quero me arriscar baixar a ISO como eu sei que não veio adulterado algum hacker esperto subiu um servidor do note dele adulterou o DNS do roteador do aeroporto e agora todo download que eu faço na verdade é uma maware baixamos também o arquivo pon ISO psig e podemos checar com o seguinte comando dpd verify o arquivo PS e o arquivo iso
dentro desse arquivo de assinatura tem o hashing do iso assinado pelo manjaro build server ele checa o hash e diz good signature então o binário do iso pelo menos bate com o hashing dentro da assinatura Mas aí tem um bugzinho que pelo jeito existe faz alguns anos no mandaro a chave desse servidor de build não pode ser confirmado sei lá por não veem já pré-instalado como deveria e quando Vai checar D esse aviso o certo era ter o certificado raiz desse Build @mandela.lounge vocês terem na cabeça o que é um hash uma impressão digital e
uma assinatura digital deixa eu expandi o exemplo do download da iso para algo que muitos de vocês já devem ter usado pelo menos uma vez na vida bit torrent e de novo o objetivo do vídeo não é ser uma explicação detalhada sobre bit torrent então procurem a documentação depois eu quero que vocês consigam entender os conceitos de criptografia que ele usa e como eles resolvem o problema de arquivos distribuídos vamos lá no próprio site do mand eu posso baixar um arquivo pon torrent um download normal que é o link do lado vai puxar os 3.7
GB direto do Servidor da empresa do mandaro Mas com esse arquivo P torrent a expectativa é conseguir baixar até mais rápido ou com mais estabilidade porque vou baixar pedaços da ISO de diversos piers diferentes pela internet todo mundo que baixou a ISO e deixou o programa de bit torrent ativo tá compartilhando o mesmo arquivo eu posso baixar pedaços em paralelo de várias pessoas diferentes Essa é a ideia básica de um Beach torrent tangente de história nos anos 90 a internet era muito mais lenta que hoje conexões de moden discado no mundo dos Servidores era tudo
super imaturo ninguém sabia como manter servidores de download decentes além de banda ser caro era terrível E no meio disso surgiram os primeiros serviços de compartilhamento de arquivos vulgo pirataria como lendário napster seguidos de copycats nos anos 2000 como limewire casa e Donkey e outros mas o princípio na época era só um jeito de dizer para as outras pessoas quais arquivos tem na minha máquina para compartilhar e deixar todo mundo baixar livremente é o modelo mais simples de compartilhamento de arquivos foram anos de controvérsia diversos processos da indústria de música até culminar no surgimento dos
primeiros serviços comerciais de venda de música e depois de assinatura como os iTunes e Spotify de hoje o grande defeito desse modelo simples de compartilhamento é que era muito fácil identificar quem tinha os arquivos e ir processar direto essa pessoa derrubando o compartilhamento uma vez que desliga a máquina do cara somem os arquivos e ninguém baixa mais esse era o problema a ser resolvido o problema ainda não foi totalmente resolvido mas vamos ver como bit torrent melhorou radicalmente nossa situação Primeiro de tudo precisamos acabar com o conceito de um servidor único Centralizado de arquivos de
onde Tod todo mundo puxa é o mesmo problema do servidor de isos da manjaro se todo mundo vai no mesmo lugar para baixar quanto mais gente descobrir o servidor mais lento vai ficar para todo mundo e maiores os riscos desse servidor cair ou ser derrubado e todo mundo ficar sem nada lembram da minha série sobre armazenamento sistemas de arquivos e tudo mais o que que é um arquivo é só um linguição de bits por baixo dos panos eles são organizados como blocos de bits podemos picotar um arquivo como quiser e depois remontar inclusive é assim
que eles são gravados em HDs e ssds fora de ordem vamos simular esse exercício num terminal de Linux só para ter essa imagem na cabeça podemos fazer isso com qualquer arquivo seja texto ou binário já expliquei que pro computador não faz diferença nenhuma por baixo é tudo um linguição de bits só para nós humanos que faz diferença porque arquivos texto conseguimos abrir e ler diretamente de exemplo eu peguei o script do episódio 142 que foi a explicação sobre chat GPT esse script tem 94 KB ou seja 94.000 letras eu quero conseguir dividir isso em arquivos
iguais de exatamente 10 KB cada para simular blocos de 10 KB para isso usamos o comando split que tem em Linux só passar o tamanho de cada pedaço o arquivo original e o prefixo do nome dos pedaços que eu vou chamar de Chunk pronto obviamente só o último arquivo vai ser menos que 10 KB mas vejam como consegui dividir direitinho eu posso tentar dar Cat em cada pedaço e vai vir o trecho do script quebrar arquivos grandes em pedaços menores era algo que fazíamos o tempo todo nos anos 90 porque era muito arriscado tentar fazer
download de um arquivo gigante o modem podia desligar no meio do caminho algoritmos de checagem de corrupção ainda não eram difundidos então podia vir sujeira na linha e o arquivo ser corrompido se viesse corrompido precisava mandar baixar tudo de novo do zero então dividíamos o risco era melhor deixar agendado para ir baixando um pedaço de cada vez se alguma coisa desse errado só um pedaço ia ser corrompido e dava para baixar só aquele pedaço separado depois em vez de ter que recomeçar do zero hoje em dia o próprio protocolo http suporta resumir um download pela
metade e o protocolo TCP garante que os pacotes não vão vir corrompidos como eu já expliquei na série de redes mas eu tô falando de uma era antes dessas facilidades E agora vocês já sabem uma forma de manualmente checar se os meus pedaços vieram corretamente era ter um arquivo com o hash de cada pedaço assim podemos comparar o hash do download e ver se nada foi corrompido lembra como eu tô falando de anos 90 poderíamos fazer o chá um de cada pedaço por exemplo Eis o hash do primeiro pedaço com o comando shaum Sam com
um pouco de mágica de script de Shell podemos fazer a mesma coisa para todos os pedaços e colocar no arquivo index.txt da seguinte forma fazendo para cada file ou arquivo que começa com Chunk Gere o xum e vá adicionando nesse arquivo index.txt por isso é interessante aprender sobre scripts de Shell abrindo o arquivo index.txt comcat temos o nome do arquivo de cada pedaço seguido do seu hash xum olhem como o xa1 do primeiro arquivo bate com o que geramos na mão antes então tá correto além disso esse arquivo Me diz exatamente a totalidade dos pedaços
que eu preciso baixar poderíamos fazer outro script para baixar cada pedaço checar o xa um E se vier errado mandar refazer o download só daquele pedaço fica de exercício para vocês fazerem isso ok fizemos o download de todos os pedaços e agora como remontamos o arquivo original é simples Basta dar catch de todos os pedaços e redirecionar para um arquivo final assim Cat Chunk asterisco maior para restor de.txt isso funciona em shells modernos porque a maioria sempre lista os arquivos em ordem alfabética caso o seu não faça isso precisaria primeiro usar o comando sort e
de novo fica de exercício mas assumindo que o cat pegou cada arquivo Chunk na ordem certa como eu sei que o arquivo restored P TXT realmente é idêntico ao original vocês já sabem né só comparar o hash dos dois e como podem ver é exatamente igual se um único bit tivesse vindo errado os hashes seriam diferentes ão entendendo como podemos manipular qualquer tipo de dados e garantir a integridade deles via ferramentas criptográficas sabe sabendo desses conceitos eu vou fazer uma explicação super de alto nível para explicar como bit torrent tira proveito disso que eu acabei
de explicar Existem duas formas de baixar um arquivo via torrent um é baixando um arquivo pon torrent como aquele do site do manjaro podemos usar o programa transmission Show que vem no pacote transmission C para abrir e ver o conteúdo desse arquivo O importante desse arquivo é que ele identifica o que vamos baixar no caso o ISO e onde podemos achar esse arquivo primeiro temos esse tal de Tracker um Tracker é um servidor que contém listas de peers que tão online e que tem o arquivo com esse hash se tiver pelo menos um Pier ativo
que seja um Cider vai começar a baixar Pier é o nome que Damos Para qualquer máquina PC servidor participando dessa rede um Tracker não necessariamente tem o arquivo ou seus pedaços Mas sabe quem pode ter que são os Pierce você já deve ter visto essa nomenclatura em programas de torrent como Cub bit torrent ou transmission quanto mais seeders tiver ativo Melhor será o download seeders são computadores online que também estão compartilhando o mesmo arquivo ou pedaços liters são computadores online fazendo download mas não contribuindo em nada parasitando mesmo liching o algoritmo do bit torrent tenta
ser justo e deixar download mais rápido para quem contribui e download mais lento para quem só parasita trackers só compartilham e sincronizam a lista desses pears Pear podem ser tanto seeders quanto liters quanto mais seeders mais rápido download quanto mais liters e menos ciders mais lento download o mundo ideal é todo mundo ser Cider Alguns são chatos e desligam mesmo outros realmente não conseguem contribuir porque a rede do provedor bloqueia e eles não sabem como furar firal eu falo de furar firal na série de redes depois procurem saber mais como habilitar portas usar VPN para
torrent coisas assim assim eu não vou falar disso hoje vamos voltar para arquivo pon torrent Olhe outras informações que ele nos dá sabemos que o arquivo iso tem 3.7 GB como eu já repeti várias vezes e sabemos que esse torrent tá organizado em 1769 pedaços de 2 MB cada lembra os chuns que eu fiz usando o comando split é a mesma coisa ele não mostra aqui mas dentro desse torrent vai ter uma lista de pedaços seguido do hash de cada pedaço parecido com aquele arquivo index.txt que eu fiz no exemplo cada Cider que o Tracker
conhece vai ter ou o arquivo inteiro ou o arquivo parcial porque ainda não terminou o download agora eu que comecei o download agora começo a baixar cada um desses pedaços de cada um dos ciders disponíveis em paralelo por exemplo Digamos que na rede tenha o Cider John a Cider Sara e o Cider Kyle e eu vou baixar aquele meu arquivo de script eu começo a baixar o Chunk aa do John o Chunk a b da Sara o Chunk AC do Kyle e assim por diante toda vez que um Chunk tem termina de baixar eu consigo
checar o hash e sei que tá correto daí eu peço o Chunk seguinte distribuindo a carga entre todos os ciders se outra pessoa aparecer pedindo o mesmo arquivo Talvez ele Pegue um Chunk de mim entenderam o Cider não precisa ter o arquivo completo para começar a contribuir basta pelo menos ter um Chunk completo e por isso quanto mais gente tiver menos pesado fica para todo mundo especialmente pro servidor principal da mandaro é a base da Computação distribuída se não tiver nenhum Sider ativo o arquivo P torrent aponta para um web seed que é o link
pro arquivo original no servidor da mandaro daí seria como um download direto normal mesmo entenderam até aqui com uma lista de pedaços e seus respectivos hashes distribuídos entre diversos computadores num swarm ou em chame e cada um baixando um pedaço do computador do outro até todo mundo ter o arquivo completo Essa é a arquitetura básica por trás do bit torrent bit torrent é desse Centralizado no sentido que diferente de um iTunes da Apple não tem uma única empresa nem um único servidor que centraliza todos os downloads eis alguns mecanismos que tornam o bit torrent resiliente
embora não totalmente invulnerável de cara poderíamos pensar que se derrubarmos quem mantém trackers poderíamos parar um enxame então primeiro não existe somente um Tracker existem diversos trackers Servindo um de backup pro outro precisaria derrubar todos os trackers em atividades no mundo mas isso não seria suficiente Toda vez que você abre um programa como transmission ou nano torrent da vida ele faz bootstrapping usando uma lista de bootstrapping nodes uma lista de nós bem conhecidos na rede que acreditamos que costumam tá online vários deles são esses nós que nos ajudam a achar outros nós assim como trackers
eles também não são pontos únicos de falha quando seu programa se conecta e acha um Tracker ou Bootstrap em node ele se junta a a rede DHT ou hash table distribuído Cada nó que entra na rede armazena informação sobre a rede toda ou um pedaço da rede Então quando você pergunta ao DHT por alguma coisa o seu cliente de bit torrent Manda uma requisição para um nó que ele conhece esse nó ou vai ter informação e te retornar ou vai te Direcionar para outro nó que pode saber essa informação e a partir desse ponto você
como nó da rede passa a ter essa informação e pode responder a alguém que te perguntar também to todo mundo se torna backup e contribui para outras pessoas o conceito de trackers é um pouco obsoleto na realidade das primeiras versões de beach Thor ele veio evoluindo e agora temos o conceito de DHT e Pex que é peer Exchange mesmo derrubando todos os trackers cada pessoa conectada na rede contribui para distribuir a informação do resto da rede hoje em dia os programas de bit torrent implementam as duas maneiras eu falei do arquivo pon torrent que baixamos
para começar um download via Bach torrent mas nem precisamos desse arquivo vocês já devem ter visto que se chama de link magnético que é tipo uma url que usa o protocolo magnet lembram o arquivo P torrent da ISO do mandaro que baixamos podemos gerar um link a partir dele usando o programa transmission show com a opção traço m é esse link que encontramos em diversos sites que listam Torrents para baixar veja num Pirate Bay da vida onde tem esse ícone de iman quando clica automaticamente pede para abrir o seu programa de torrent instalado a parte
mais importante é esse btih logo no começo que é o bit torrent info hash o hash que identifica unicamente esse arquivo de ISO o resto ajuda mas é opcional por exemplo ele tem o link pro web seed caso ninguém esteja oferecendo o arquivo na rede e também o link para um Tracker vamos fazer aqui um HTML idiota com o link para esse magnet um link com a URL inteira que foi gerado e o segundo link só com o infes se abrir no navegador e clicar no link o Media Type tá associado ao qubit torrent instalado
no meu mandaro ele abre e oferece para começar a baixar se eu abrir pelo segundo link mesmo sem essa informação de web seed nem de Tracker só com o info Olha só abre normalmente e oferece para baixar igual isso porque o cubit Torrent na minha máquina se uniu à rede via DHT e Pex e conseguiu achar os seeders e já sabe como começar a baixar entenderam para parar um arquivo de ser comp compartilhado não basta derrubar todos os trackers precisa parar 100% de todo mundo que tá compartilhando o arquivo de todas as partes do mundo
ao mesmo tempo se tiver só um nó na rede funcionando dá para continuar compartilhando porque via DHT e Pex essa informação vai voltar a ser distribuída computação distribuída é fascinante por causa disso ninguém consegue parar somente com uma canetada sem comprometer a internet inteira de funcionar direito por isso eu gosto desse conceito DHT e Pex são assuntos fascinantes por si só para garantir a descentralização da rede então eu espero que vocês pesquisem mais sobre isso depois é um ótimo tema para TCC mas tem um assunto menos comentado que eu acho ainda mais interessante e é
o conceito de árvores de hash ou merkle Trees nome dado por causa do criador do conceito Ralph Merkel que inventou isso no fim dos anos 70 vamos lá o que temos até agora é um arquivo index.txt com uma lista de chunks ou pedaços daquele meu arquivo de script 10 pedaços com o xá um do lado de cada um lembram numa versão rudimentar de bitent eu poderia ter baixado esse arquivo e perguntado na tabela distribuídas de hash o tal DHT de onde baixar cada pedaço identificado pelo shaum que serve como um ID único para cada pedaço
depois que fizer o download de cada pedaço basta rodar o comando xa1 su e comparar o hash com o que tem no arquivo index.txt se bater é porque veio correto sem corromper nada e no final basta com encenar os pedaços Como Eu Fiz antes gerar o hash do arquivo todo comparar com o hash m do arquivo original para garantir que eu tenho o mesmo arquivo no final parece simples e parece que só isso é o suficiente né mas no mundo real tem várias razões de porque isso não é suficiente para começar via bit thorment podemos
trafegar arquivos de qualquer tamanho gigante eu posso compartilhar diretórios inteiros com milhares de arquivos eu poderia fazer um torrent do C2 pontos inteiro do meu Windows Se eu quisesse e eu posso puxar pedaços de diversos nós diferentes no enxame de computadores participando na rede para validar o hash de tudo Dessa forma não seria prático imagine ter que computar o hash Zão do seu HD inteiro para saber se o que eu fiz download tá correto seria muito pesado em alguns casos até inviável em programação você sempre vai bater nesse caso para um arquivo pequeno com poucos
kilb ou mab de tamanho o esquema simples de um arquivo de hhs é mais que suficiente mas pra escala de internet n onde podemos querer lidar com gigab ou terab milhares de arquivos no mesmo torrent não vai escalar pense assim temos 10 hashes um para cada pedaço e temos um hash mestre que valida o arquivo completo inteiro eu recebo esses hashes e começo a fazer download de algum nó veio esse primeiro pedaço Chunk aa o hash começa com C3 BB eu rodo o comando xa1 su e vejo que sim o hash começa com C3 BB
mesmo bacana isso só garante que o pedaço é quem ele diz que é mas como eu eu sei que de fato esse pedaço faz parte do arquivão inteiro a única forma é baixar todos os 10 pedaços concatenar tudo rodar o xsan pro arquivo gerado e comparar com o hash mestre só assim eu vou saber que todos os pedaços são realmente válidos para esse arquivão entenderam os hashes individuais não me dizem nada sobre o arquivo inteiro original eu tenho que confiar que o nó da rede que me deu essa informação não mentiu para mim imagine se
fosse um Thor como eu falei antes com vários arquivos e muitos gigab eu só ia ter certeza que todos são válidos depois que baixar Tudo além disso em bit torrent vocês já devem ter visto que podemos escolher baixar somente alguns dos arquivos e não todos então de cara esse esquema de só ter um hash mestre para tudo não funciona eu preciso de hashes parciais no mínimo um para cada arquivo separado não e mesmo assim eu preciso garantir que esse arquivo uma vez que eu baixei os pedaços e montei de fato faz parte do conjunto todo
sem ter que baixar o conjunto todo Como que faz para simplificar Vamos partir de novo do exemplo de 10 pedaços Imagine que isso poderia ser um arquivo de milhares de pedaços dezenas de arquivos em subdiretórios é uma simplificação Ok pois bem eu começo organizando esses pedaços em pares Chunk aa com Chunk a depois Chunk AC com Chunk AD e assim por diante pares de pedaços agora pegamos o hash de cada par e concatenam só eles por exemplo exemplo o hash C3 BB do Chunk aa com o hash 79 A4 do Chunk AB e Gero o
hash dessa combinação vai dar um hash que começa com 02 85 faço a mesma coisa com os hashes do próximo par vai dar um novo hash que começa com 84 de E continuo fazendo isso pros outros pares no final eu vou ter cinco novos hashes agora Eu repito o mesmo processo organizo pares de hashes con cateno e Gero um novo hash para cada par pego esse hash que começa com 0285 com o hash que começa com 05 E4 e Gero o hash que começa com 9361 eu faço isso pro segundo par só no terceiro par
que eu vou ter problemas porque o último hash vai ficar sozinho não tem problema eu Gero o hash dele também concatenado com vazio mesmo vamos repetir mais uma vez par de hash 9361 com 910e vai dar BD F3 e o último H é 2354 e pronto chegamos ao final temos só dois hash resultantes geramos o hash da concatenação desses dois também vai dar um hash final que começa com com F2 FB esse hash é especial é o que chamamos de merkle Root ou raiz merkle é o hash que engloba todos os outros hashes antes se
eu só tivesse o hash mestre precisaria de todos os 10 hashes de cada pedaço para saber se tá tudo correto mas nesse esquema da árvore de Merco Digamos que eu queira saber se o pedaço aa que eu acabei de baixar realmente faz parte do arquivo final sem baixar os outros pedaços Como que eu faço eu peço pro servidor somente os hashes do irmão a com isso consigo calcular a a e a b Como Eu Fiz antes daí eu preciso que o servidor me mande os quatro hashes acad ae Af a g aah e a i
a j tendo só mais esses quatro hashes mais o HAS do Pedaço aa eu consigo recalcular a árvore e achar a raiz Merco e comparar com o que o servidor me indicou se bater quer dizer que esse pedaço que eu baixei faz parte do arquivo final repetindo eu diminuí a necessidade de precisar de todos os 10 hash para somente 4 hh entenderam de novo é um exemplo super pequeno e simples só para caber aqui na tela mas veja aquele exemplo da ISO do mandaro lembram eram quase 100800 pedaços se eu baixar só um pedaço para
garantir que ele faz realmente parte do iso original precisaria calcular o hash mestre usando quase todos os 10000 hash mas organizado numa árvore precisaria só de log de 248 que dá 11 a árvore precisa ser balanceada e o próximo número acima de 1800 que balancei uma árvore binária é 2048 enfim eu preciso que o servidor me mande a raiz Merco que ele tem pré calculado e 11 reches dessa árvore mais ou menos não é um número exato nesse log mas entenda que 11 é uma ordem de grandeza menos reches do que 100800 mesmo nesse exemplo
simples de só uma ISO de manjaro Já temos um ganho significativo bit Thor não foi criado com árvores Merco isso é uma coisa mais recente da mesma forma que hoje não precisaria de de trackers por causa de DHT e pexs é uma tecnologia ainda em evolução lembra do que eu falei no vídeo sobre bancos de dados árvores são as estruturas de dados mais importantes da Computação tudo são árvores nesse caso árvores binárias mas eu já falei de B3 b+ 3es em Sistemas de arquivo depois assista o meu vídeo de árvores sabe que outro programa se
beneficia de árvores merkle o Git O que são comits são difs com trechos de arquivos de código fonte mais metadados como o nome do arquivo autor da modificação datas uma característica importante de um comite é que ele é identificado por um hash um xa um do seu conteúdo é como sabemos que o conteúdo não foi adulterado da mesma forma como fizemos para checar os chunks do download via Bach torrent mas um comite de Git tem outra característica importante ele contém o xa um do comite Pie anterior por isso comits forma uma cadeia Mais especificamente uma
árvore objetos de árvore de diretórios também tem cha um dos objetos filho tudo isso forma um Dag um Direct a cyclic graph ou grafo direcionado Não cíclico Mais especificamente uma merkle Dag uma característica importante é que como todo comite contém o xa do comite anterior é impossível modificar só um comit no meio da árvore precisaria reescrever todos os comites na frente e regerar chaum novos para todos é o que chamamos de reescrever a história vocês já devem ter ouvido falar disso em discussões é melhor fazer merge ou rebase e todo mundo é contra fazer rebases
na Master porque isso reescreve a história é isso que significa reescrever a história tem que regerar o xa1 de todos os comites pra frente deixa eu mostrar rapidamente com um exemplo Vamos iniciar um novo repositório com Git init e criar um arquivo de teste idiota só para criar o primeiro commit fazendo Git log vemos o commit identificado pelo hash que começa com 4B 4c agora vamos criar um novo Brand chamado teste modificar o o arquivo e criar um novo commit no caso criou um novo commit identificado pelo hash que começa com 65 C2 agora eu
vou voltar pro Branch Master criar um novo arquivo qualquer e gravar em outro commit veja só criou esse commit com hash que começa com 9431 agora em vez de merge eu vou fazer rebase do Branch Test em cima do Branch Master com Git rebase test como eu não fiz nada demais vai terminar sem nenhum conflito fazemos Git log e olha só o commit que eu tinha acabado de fazer que tinha o hash começando em 9431 agora começa com e00 isso porque antes o comite anterior era o initial commit com o hash 4B 4c como eu
fiz rebase Ele trouxe o commit eding Hello again de hash 65 C2 que passa a ser o novo pai do comit eding test Portanto o hash desse comit tem que ser recalculado e por isso mudou para e00 ou seja acabamos de reescrever a história esse conceito é muito importante ao colocar o xa um do comite anterior no comite atual criamos uma dependência entre esses dois objetos se o objeto anterior mudar se seu hash mudar o hash do objeto seguinte vai ser invalidado e precisa ser recalculado também não dá para simplesmente entuchar um comite no meio
da cadeia sem consequências e é isso que garante a integridade do código fonte armazenado nesse repositório Se alguém tentar adulterar um comite lá do passado ele vai ser obrigado a fazer um rebas de de tudo pra frente ou seja recalcular o xa de todo mundo daí todo mundo vai imediatamente saber que o repositório foi modificado porque os ids de tudo vão est diferentes É onde temos que lidar com conflitos depois se você nunca parou para entender como o Git realmente funciona recomendo que assista o meu vídeo de entendendo Git entenda ter um meracle Tree não
impede que um comit seja adulterado só torna mais fácil de identificar quando for e torna mais barato fazer os cálculos para chegar nessa conclusão do que ter que que checar o xa de 100% de tudo no caso de Git que é um repositório descentralizado Digamos que era uma equipe de cinco pessoas uma delas faz pull do github e nota que alguém fez merda e deu push traço traço Force de um rebase gigante que reescreveu centenas de comites você consegue ver que isso aconteceu e consegue Ligar para um dos seus colegas que ainda não fez pull
e pedir para ele dar um novo push traço traço Force para recuperar o histórico como era antes e eliminar a cagada o fato de termos várias cópias do mesmo repositório nas máquinas de todo mundo é um tipo de backup se o repositório elegido como principal ficou zoado tem formas de recuperar e não precisa sobrescrever tudo só a partir do comite onde deu rebas entenderam Existem várias discussões sobre centralizadores de Git como gth Hub Ou gitlab eles centralizam a confiança de Git neles mas Git Originalmente não era para ter um ponto único de falha você pode
fazer Git clone do repositório de alguém localmente num p drive como eu mostrei no episódio anterior não precisa Obrigatoriamente ter que fazer Git Clone de um repositório do gth HUB isso é outra discussão mas só para vocês saberem que Git também foi feito para ser distribuído mas hoje em dia usamos Centralizado num gth Hub da vida voltando pro exemplo de bit torrent como qualquer computador na internet pode participar do compartilhamento de arquivos sim algum computador malicioso poderia começar a tentar espalhar binários adulterados mas o principal é o arquivo pon torrent ou link magnético que aponta
para algum nó que normalmente confiamos que vai nos fornecer a árvore merkle com os hashes tendo os hashes conseguimos checar se os pedaços que baixamos são válidos ou não esses hash são organizados numa tabelon Mais especificamente numa tabela distribuída ou distributed hash table o DHT que eu fico falando para Quem é desenvolvedor web é parecido com Dynamo DB cada item nessa tabelon ganha um ID longo de 160 bits e os possíveis ids são são particionados entre os diversos nós da rede de tal forma que Cada nó só é responsável por um pedaço do espaço de
ids disponíveis toda vez que algum nó precisa registrar alguma coisa ele gera uma chave e com isso determina Qual o nó que é responsável pelo espaço de ids que essa nova chave faz parte e manda para esse nó mesma coisa para pesquisar dados na tabela tendo o ID para consultar Ele pergunta pro nó responsável por esse intervalo de ids uma rede de B torit é gigantesca milhares ou milhões de nós ao mesmo tempo é impossível o meu computador saber quais são todos os nós ativos nesse exato momento no mundo em vez disso Cada nó mantém
um tipo de tabela de roteamento com informações sobre um subconjunto dos Nós na rede preferencialmente os mais próximos do espaço de ids quando alguém Pede pro seu nó gravar ou ler um certo ID mas você não é o responsável dá para usar essa tabela de roteamento para redirecionar pro nó certo e claro um nó pode simplesmente desaparecer do nada como Cada nó pode ser um computador caseiro alguém pode desligar o pc e sair da rede por isso essas informações são redundantes entre vários nós os algoritmos de DHT e roteamento vão se balanceando e atualizando dinamicamente
com nós entrando e saindo se isso pareceu similar a um banco de dados no Cico distribuído como Amazon Dynamo DB ou Cassandra é porque é uns três ou quatro episódios atrás eu expliquei como funcionam Chaves distribuídas depois assistam o bit torrent não deixa de ser um grande banco de dados no CCO distribuído são tecnologias similares Toda vez que você abre um programa como transmission ou cubit torrent para baixar alguma coisa tá participando dessa coordenação toda e se tornando um nó réplica de um grande banco de dados noso distribuído Você só não sabia disso diferente de
um banco de dados eu não preciso que todos os dados que já foram gravados num DHT permaneçam lá para sempre arquivos novos aparecem arquivos que ninguém mais quer desaparec se não tem ninguém compartilhando algum determinado arquivo não preciso ter informações dele trafegando seria ineficiente só interessa arquivos que alguém está compartilhando num Git já não eu preciso que tudo que os desenvolvedores do projeto fizeram seja adicionar novos arquivos modificar ou até Apagar existentes seja devidamente registrado no log de comits do repositório e que seja possível voltar para qualquer momento no passado e ter tudo intacto exatamente
como era não pode ser parcial por outro lado não pode ficar no caminho do desenvolvedor e adicionar obstáculos se o desenvolvedor achar que quer reescrever a história precisa deixar a resiliência do Git aparece numa equipe com mais de uma pessoa basta ter mais um desenvolvedor que tem como comparar os repositórios nas máquinas de cada um e Verê que houve problemas basta checar os hashes dos comites se tiver três desenvolvedores já temos como fazer um tipo rudimentar de consenso o que tiver o histórico mais diferente tá errado Eu só expliquei os conceitos bem básicos tem bem
mais detalhes por trás para vocês pesquisarem depois árvores Merco são úteis para Beach torrent e para Git mas também são usados em outros lugares o sistema de arquivos efs que é usado no tras para grandes servidores de armazenamento e também usa árvores Merco para detectar corrupção de dados e ter a funcionalidade de snapshots com pouco overhead que eu já mostrei no último episódio outras redes ponto a ponto como ipfs que é o interplanetary file System um sistema de arquivos distribuídos Global usa árvores Merco Mais especificamente merc degs como Git não só sistemas de arquivos mas
bancos de dados distribuídos como Cassandra ou hiak usam árvores de merc para minimizar a quantidade de dados que precisam ser transmitidos paraa sincronização de dados no começo do vídeo eu mostrei a cadeia de certificados e como o certificado do meu domínio é assinado pela let encrypt que por sua vez é assinado pela isrg e o protocolo tls usa uma variante de árvore de Merco chamada Merco hash 3 no Framework de certificado de Transparência para fornecer um log auditável de certificados gerel e essa característica é importante qualquer coisa que precise ser auditável pode usar árvores Merco
para oferecer prova de inclusão de forma que é possível provar que um pedaço de dados faz parte de um determinado conjunto sem revelar o conjunto inteiro e se você já parou para estudar o básico de Bitcoin e outras criptomoedas já deve ter se deparado com árvores Merco e Merco H é o que tá na raiz do bloco de transações da tal de blockchain um blockchain e um repositório Git ou a árvore de Merco de beach torrent São muito parecidos Eles garantem que não dá para adulterar um bloco sozinho sem precisar regerar todos os blocos à
frente dele com um ingrediente a mais o tal processo de mineração em Git um rebas é uma operação razoavelmente rápida mas num blockchain de Bitcoin O equivalente de rebase de Git custa absurdamente caro astronomicamente caro na real o que garante que é perto de Impossível fazer um rebase é isso que torna o blockchain interessante um blockchain Onde é barato fazer rebase não é diferente de um Git e como reserva de valor não vale nada tudo que eu expliquei nesse Episódio são as tecnologias que estão na Fundação do Bitcoin e se conseguiram chegar até aqui no
nós vimos na prática como encriptação com chave simétrica funciona aprendemos como funciona a troca de Chaves usando criptografia assimétrica vimos Como quebrar arquivos e trafegar pedaços de uma forma que conseguimos checar se os pedaços vieram corretamente e vimos com o bit torit e Git funcionam com árvores merkle tudo em computação moderna usa esses conceitos em particular certificados digitais tls bancos de dados no Cico e até Bitcoin por isso é importante estudarem tudo se ficaram com dúvidas deixem nos comentários abaixo se curtiram o vídeo mandem o joinha assinem o canal e não deixe de compartilhar com
seus amigos a gente se vê até mais que é de onde pacotes com Open tiver a minha chave conseguiria server tá na WS então eu propriamente dito que vai ser mantido para ã tem o site nesse domínio mas se tivesse nos xex One instalado na máquina ele SSL para encriptar Mas como eu já mostrei lembram porque o z RS lá no começo Ah meu Deus pra curva elíptica tá fora do escopo ô dependendo do caso de ô filha de uma putao pelo chá 512 e tem algoritmos melhores do que outros e assista Ah é xizão
do seu 354 e ponto pronto Eu precisaria calcular o hash mestre usando
Copyright © 2024. Made with ♥ in London by YTScribe.com