O documento apresenta um resumo sobre criptografia. O palestrante discute a importância da segurança na internet, define o que é criptografia e seus objetivos, e apresenta exemplos de como criptografar e descriptografar mensagens usando ferramentas como OpenSSL, PGP e MCrypt.
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
Tales of the Crypto
1. Adler Medrado
Tales of the Crypto
PHP Conference Brasil 2012 Imagem: Cryptomuseum.com
Monday, December 3, 12
2. Quem sou eu?
• Desenvolvedor, Consultor,
Instrutor;
• Trabalha na Sigma Dataserv;
• Co-Fundador do PHPDF;
• Fui apresentado ao PHP em
1999;
• Tenho meu próprio podcast
(getOnCode);
• ZCE
• PHP 5;
• Zend Framework;
Monday, December 3, 12
3. Objetivos
• Mostrar como algumas ferramentas que
auxiliam no uso de criptografia com PHP
• Criptografia é um assunto complexo para
podermos abordar a fundo aqui
• Quer estudar? https://www.coursera.org/
course/crypto
Monday, December 3, 12
4. Segurança
• Atualmente há consenso que é necessário
obter segurança nas transações realizadas
pela internet
• A segurança é composta de diversos
fatores e a criptografia é uma delas
Monday, December 3, 12
5. O que é criptografia?
• Uma ciência
• Nome tem origem no grego - kryptós
(escondido) e gráphein (escrita)
Monday, December 3, 12
6. Entusiastas da
Criptografia
• Sun Tzu
• Hitler
• Carl Von Clausewitz
Monday, December 3, 12
7. Segunda Guerra
http://www.navajocodetalkers.org/
Monday, December 3, 12
9. Para que serve?
• Garantir Integridade do Dado
• Prover segurança em transações
confidenciais
• Privacidade
• Garantia de Autenticidade
Monday, December 3, 12
10. Para que não serve
• XSS
• SQL Injection
• Session Hijacking
• Engenharia Social
• "As pessoas são o elo mais fraco" -Kevin Mitnick
Monday, December 3, 12
12. Não tente criar seu
próprio algoritimo
Monday, December 3, 12
13. Por mais que você seja bom, seu algoritimo tem grandes
chances de ser inferior aos já existentes e que são abertos
Monday, December 3, 12
14. A não ser que você seja um matemático acima da média.
Monday, December 3, 12
15. Se você fizer algo superior ao que já existe, por favor,
torne-o um padrão aberto.
Monday, December 3, 12
16. Se a Microsoft, Oracle ou Apple te oferecessem um
algoritimo fechado para você criptografar os dados
da sua empresa, você confiaria?
Monday, December 3, 12
17. E se o governo te oferecesse, você aceitaria?
Monday, December 3, 12
18. Dê a preferência, sempre, aos algoritimos abertos
Monday, December 3, 12
19. Criptografando
mensagens
• Código
• Quando é necessário um código para
decifrar a mensagem
• Cifra
• Esconde conteúdo original dentro de
outro
Monday, December 3, 12
20. Cifras
• Exemplo 1 - Texto substituído por número e somado a valor
chave
EU VOU PRA CASA
5 20 21 14 20 15 17 1 3 1 18 1
15 30 31 24 30 25 27 11 13 11 28 11
codigo = 10
Monday, December 3, 12
21. Cifras
• Exemplo II - Cifra de Cesar
Normal: a ligeira raposa marrom saltou sobre o cachorro cansado
Cifrado: D OLJHLUD UDSRVD PDUURP VDOWRX VREUH R FDFKRUUR FDQVDGR
http://pt.wikipedia.org/wiki/Cifra_de_C%C3%A9sar
Monday, December 3, 12
22. Como você salva
passwords ?
• Plain Text?
• Hashing?
Monday, December 3, 12
23. Hashing
• Mais comuns
• MD5 - Message Digest Algorithm - RFC 1321
• SHA1 - Secure Hash Algorithm - NIST-FIPS 180-1
Hashing normalmente possuem tamanho fixo, geralmente
128 ou 256 bits, independente do tamanho de entrada.
Além de MD5 e SHA-1, existem diversos algoritimos de
hashing.
Monday, December 3, 12
24. Colisão de Hashes
• Por terem tamanho fixo:
• deduz-se que os hashes gerados são limitados
• se há limite, dois valores diferentes podem ter o mesmo
hash
• se isso acontecer, é uma colisão de hashes
Monday, December 3, 12
25. Brute Force
$password = 'vidaloka';
md5($password);
Monday, December 3, 12
26. Salt
$password = 'vidaloka';
$salt = 'phpconf';
md5($salt.$password);
Monday, December 3, 12
27. Outras Opções
• hash
• Pode ser desabilitado na compilação
• Risco ao mudar de ambiente
• crypt
• Está no core
Monday, December 3, 12
28. hash
hash('adler32', 'vidaloka');
Algoritimo com o nome mais bonito do mundo
Para saber quais algoritimos estão disponíveis
var_dump(hash_algos());
Monday, December 3, 12
30. Criptografia Simétrica
• O mésmo código/chave usado para
criptografar é usado para descriptografar
• Por usar a mesma chave, o algoritimo
criptográfico usado é mais simples
• Por possuir um algoritimo mais simples, é
mais rápida que a assimétrica
Monday, December 3, 12
31. Criptografia
Assimétrica
• Utiliza um par de chaves: pública e privada
• As chaves são diferentes, entretanto,
matemáticamente relacionadas
• Mais seguro
• Mais lento
Monday, December 3, 12
32. Algoritimos populares
• AES - Simétrica
• RSA - Assimétrica
Existem diversas bibliotecas que abstraem o trabalho sujo
• OpenSSL
• PGP/OpenPGP/GnuPG
• MCrypt
Monday, December 3, 12
33. OpenSSL
• Open-Source
• Toolkit que implementa suporte aos
protocolos SSL e TLS
• Oferece uma biblioteca criptografica de uso
geral
• Suporte a diversos padrões e algorítimos
• Provê mecanismos para gerar certificados SSL
Monday, December 3, 12
34. Exemplos com
OpenSSL
• Criptografia Simétrica
$texto = <<<TEXTO_SECRETO
Joguei uma pedra na água;
Ela era pesada e foi ao fundo;
Os peixinhos responderam: Viva Dom Pedro II.
TEXTO_SECRETO;
$iv = "1234567812345678";
$senha = '1234';
$metodo = 'aes-256-cbc';
file_put_contents ('arquivo.ssl.txt',openssl_encrypt ($texto, $metodo, $senha, true, $iv));
openssl_decrypt(file_get_contents('arquivo.ssl.txt'), $metodo, $senha, true, $iv);
Monday, December 3, 12
35. Exemplos com
OpenSSL
Gerando chaves pública e privada com SSL
$chave_privada = openssl_pkey_new(array(
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
openssl_pkey_export_to_file($chave_privada, 'private', '12345');
$detalhes_da_chave = openssl_pkey_get_details($chave_privada);
file_put_contents('public', $detalhes_da_chave['key']);
Monday, December 3, 12
37. Exemplos com
OpenSSL
Usando as chaves para criptografar e descriptografar
$chave_publica = openssl_pkey_get_public('file:///keys/public');
openssl_public_encrypt($texto, $dados_criptografados, $chave_publica);
$chave_privada = openssl_pkey_get_private('file:///keys/private', '12345');
openssl_private_decrypt($dados_criptografados, $dados_originais, $chave_privada);
Monday, December 3, 12
38. PGP/OpenPGP/GnuPG
• Pretty Good Privacy
• Desenvolvido em 1991 por Phil Zimmermann
• Código Aberto - Origem do OpenPGP
• Simples instalação do toolkit
• Configuração com PHP não é trivial
• Cadeias de confiança do PGP são interessantes
• KeyServers
Monday, December 3, 12
39. Exemplo com PGP
$gpg = new gnupg();
$gpg ->
addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
$enc = $gpg -> encrypt("Texto Secreto");
$res = gnupg_init();
gnupg_adddecryptkey($res,"8660281B6051D071D94B5B230549F9DC8
51566DC",'senha');
$original = gnupg_decrypt($res,$enc);
Monday, December 3, 12
40. MCrypt
• Biblioteca open-source
• Suporta diversos algorítimos
• Criptografia Simétrica
Monday, December 3, 12
41. Exemplo MCrypt
$texto = <<<TEXTO_SECRETO
Joguei uma pedra na água;
Ela era pesada e foi ao fundo;
Os peixinhos responderam: Viva Dom Pedro II.
TEXTO_SECRETO;
$chave = "segredo";
// Vetor de Identificação
$tamanho_iv = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($tamanho_iv, MCRYPT_RAND);
$texto_criptografado = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $chave, $texto,
MCRYPT_MODE_CBC, $iv);
$texto_descriptografado = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $chave,
$texto_criptografado, MCRYPT_MODE_CBC, $iv);
Monday, December 3, 12