Tales of the Crypto

Preview:

DESCRIPTION

Criptografia com PHP

Citation preview

Imagem: Cryptomuseum.com

Tales of the Crypto Adler Medrado

PHP Conference Brasil 2012Monday, December 3, 12

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

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

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

O que é criptografia?

• Uma ciência

• Nome tem origem no grego - kryptós (escondido) e gráphein (escrita)

Monday, December 3, 12

Entusiastas da Criptografia• Sun Tzu

• Hitler

• Carl Von Clausewitz

Monday, December 3, 12

Segunda Guerra

http://www.navajocodetalkers.org/

Monday, December 3, 12

Chega de história

Monday, December 3, 12

Para que serve?

• Garantir Integridade do Dado

• Prover segurança em transações confidenciais

• Privacidade

• Garantia de Autenticidade

Monday, December 3, 12

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

Criptografia != Segurança

Monday, December 3, 12

Não tente criar seu próprio algoritimo

Monday, December 3, 12

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

A não ser que você seja um matemático acima da média.

Monday, December 3, 12

Se você fizer algo superior ao que já existe, por favor, torne-o um padrão aberto.

Monday, December 3, 12

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

E se o governo te oferecesse, você aceitaria?

Monday, December 3, 12

Dê a preferência, sempre, aos algoritimos abertos

Monday, December 3, 12

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

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

Cifras

• Exemplo II - Cifra de Cesar

http://pt.wikipedia.org/wiki/Cifra_de_C%C3%A9sar

Normal: a ligeira raposa marrom saltou sobre o cachorro cansadoCifrado: D OLJHLUD UDSRVD PDUURP VDOWRX VREUH R FDFKRUUR FDQVDGR

Monday, December 3, 12

Como você salva passwords ?

• Plain Text?

• Hashing?

Monday, December 3, 12

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

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

Brute Force$password = 'vidaloka';md5($password);

Monday, December 3, 12

Salt$password = 'vidaloka';$salt = 'phpconf';md5($salt.$password);

Monday, December 3, 12

Outras Opções

• hash

• Pode ser desabilitado na compilação

• Risco ao mudar de ambiente

• crypt

• Está no core

Monday, December 3, 12

hashhash('adler32', 'vidaloka');

Para saber quais algoritimos estão disponíveis

var_dump(hash_algos());

Algoritimo com o nome mais bonito do mundo

Monday, December 3, 12

crypt$password = 'vidaloka';$salt = 'phpconf';

// Para usar Blowfish$salt = '$2a$07$'.$salt.'$'; echo 'Plaintext password: '.$password."\n";echo 'Salt: '.$salt."\n";

echo 'Blowfish hash: ' . crypt($password, $salt)."\n";

crypt + blowfish FTW

Monday, December 3, 12

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

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

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

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

Exemplos com OpenSSL

• Criptografia Simétrica$texto = <<<TEXTO_SECRETOJoguei 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

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

Exemplos com OpenSSL

Monday, December 3, 12

Exemplos com OpenSSL

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

Usando as chaves para criptografar e descriptografar

Monday, December 3, 12

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

Exemplo com PGP

$gpg = new gnupg();$gpg -> addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");$enc = $gpg -> encrypt("Texto Secreto");

$res = gnupg_init();gnupg_adddecryptkey($res,"8660281B6051D071D94B5B230549F9DC851566DC",'senha');$original = gnupg_decrypt($res,$enc);

Monday, December 3, 12

MCrypt

• Biblioteca open-source

• Suporta diversos algorítimos

• Criptografia Simétrica

Monday, December 3, 12

Exemplo MCrypt$texto = <<<TEXTO_SECRETOJoguei 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

Perguntas?

Monday, December 3, 12

Obrigado, até a próxima.http://adlermedrado.com.br

http://getoncode.com.br

@adlermedrado

Monday, December 3, 12