Criptografia com PHP
@vcampitelli
CRIPTOGRAFIACRIPTOGRAFIA
COM PHPCOM PHP
1
Criptografia com PHP
@vcampitelli
QUEM SOU EU?QUEM SOU EU?
Vinícius Campitelli •
MT4 Tecnologia • @MediaPost • Curseduca •
senhasegura
vcampitelli.github.io
2
Criptografia com PHP
@vcampitelli
O QUE ÉO QUE É
CRIPTOGRAFIA?CRIPTOGRAFIA?
3 . 1
Criptografia com PHP
@vcampitelli
é a prática e o estudo de técnicas para
comunicação segura na presença de
terceiros
é a construção e análise de protocolos
que previnam terceiros de ler
mensagens privadas
3 . 2
Criptografia com PHP
@vcampitelli
Texto claro → Texto cifrado
3 . 3
Criptografia com PHP
@vcampitelli
TIPOS DETIPOS DE
CRIPTOGRAFIACRIPTOGRAFIA
4
Criptografia com PHP
@vcampitelli
SIMÉTRICASIMÉTRICA
5 . 1
Criptografia com PHP
@vcampitelli
Utiliza uma mesma chave para criptografar e
descriptografar os textos
Exemplos
AES
3DES
RC4
Blowfish
5 . 2
Criptografia com PHP
@vcampitelli
CIFRASCIFRAS
5 . 3
Criptografia com PHP
@vcampitelli
CIFRAS EM BLOCOCIFRAS EM BLOCO
Algoritmo determinístico que usa uma chave para
transformar um bloco em um texto cifrado
AES
Blocos de 128 bits
Chaves de 128, 192 ou 256 bits
5 . 4
Criptografia com PHP
@vcampitelli
MODOS DE OPERAÇÃOMODOS DE OPERAÇÃO
Mecanismo que irá dividir a mensagem em blocos
e aplicar a cifra a cada um
Exemplos
ECB
CBC
CTR
GCM (PHP 7.1)
5 . 5
Criptografia com PHP
@vcampitelli
Tux originalTux original Tux aplicando-se CBC / CTRTux aplicando-se CBC / CTR Tux aplicando-se ECBTux aplicando-se ECB
NÃO USE ECB!NÃO USE ECB!
5 . 6
Criptografia com PHP
@vcampitelli
CIFRAS DE FLUXO (STREAM)CIFRAS DE FLUXO (STREAM)
Algoritmo que opera em um bit/byte de cada vez
Chave "infinita" de dados pseudo-randômicos
Indicado quando não se sabe o tamanho do dado
Algoritmos
RC4, mais conhecido mas inseguro
: projeto para escolher novos
algoritmos
eSTREAM
5 . 7
Criptografia com PHP
@vcampitelli
ASSIMÉTRICAASSIMÉTRICA
6 . 1
Criptografia com PHP
@vcampitelli
Chave privada: utilizada para criptografar
(escrever)
Chave pública: utilizada para descriptografar (ler)
Algoritmos
RSA
Curvas Elípticas
6 . 2
Criptografia com PHP
@vcampitelli
Provê encriptação e autenticação
Utilizada para estabelecer conexões seguras em
ambientes inseguros
Principais utilizações
SSH
SSL/TLS (certificados digitais)
PGP
6 . 3
Criptografia com PHP
@vcampitelli
PROBLEMA: TROCA DE CHAVESPROBLEMA: TROCA DE CHAVES
Algoritmo Diffie–HellmanAlgoritmo Diffie–Hellman
6 . 4
Criptografia com PHP
@vcampitelli
Criptografia com PHP
@vcampitelli
Fonte:Fonte: WikipediaWikipedia
6 . 5
Criptografia com PHP
@vcampitelli
GERADORES DEGERADORES DE
ALEATORIEDADEALEATORIEDADE
7 . 1
Criptografia com PHP
@vcampitelli
PHP 7
random_int()
random_bytes()
PHP 5.3+
openssl_random_pseudo_bytes()
PHP 5.x
paragonie/random_compat
7 . 2
Criptografia com PHP
@vcampitelli
MÁS PRÁTICASMÁS PRÁTICAS
rand() e mt_rand() não são criptogra camente
seguros
7 . 3
Criptografia com PHP
@vcampitelli
VETORES DEVETORES DE
INICIALIZAÇÃOINICIALIZAÇÃO
8 . 1
Criptografia com PHP
@vcampitelli
Utilizados para "inicializar" os algoritmos
openssl_cipher_iv_length() para buscar o
tamanho do IV para cada algoritmo
openssl_get_cipher_methods() para
descobrir os algoritmos disponíveis
8 . 2
Criptografia com PHP
@vcampitelli
EXEMPLOEXEMPLO
random_bytesrandom_bytes((openssl_cipher_iv_lengthopenssl_cipher_iv_length(('aes-256-ctr''aes-256-ctr'))));;
// Q��A|Gh���C �M// Q��A|Gh���C �M
8 . 3
Criptografia com PHP
@vcampitelli
MÁS PRÁTICAS GERAISMÁS PRÁTICAS GERAIS
mcrypt: desatualizada desde 2008
Fazer seu próprio algoritmo
9 . 1
Criptografia com PHP
@vcampitelli
NA PRÁTICANA PRÁTICA
9 . 2
Criptografia com PHP
@vcampitelli
stringstring openssl_encryptopenssl_encrypt(( stringstring $data$data ,,
stringstring $method$method ,, stringstring $key$key [[,, intint
$options$options == 00 [[,, stringstring $iv$iv == """" [[,, stringstring
&&$tag$tag == NULLNULL [[,, stringstring $aad$aad == """" [[,, intint
$tag_length$tag_length == 1616 ]]]]]]]]]] ))
9 . 3
Criptografia com PHP
@vcampitelli
$key$key == openssl_random_pseudo_bytesopenssl_random_pseudo_bytes((3232));; // chave de 256 bits// chave de 256 bits
$iv$iv == openssl_random_pseudo_bytesopenssl_random_pseudo_bytes((
openssl_cipher_iv_lengthopenssl_cipher_iv_length(('aes-256-ctr''aes-256-ctr'))
));;
$data$data == 'Olá, PHP Conference 2017!''Olá, PHP Conference 2017!';;
$encrypted$encrypted == openssl_encryptopenssl_encrypt(($data$data,, 'aes-256-ctr''aes-256-ctr',, $key$key,, 00,, $iv$iv));;
// LKdTM372XbDEYP6UnAWbhChZ7wxbaOt+6qg=// LKdTM372XbDEYP6UnAWbhChZ7wxbaOt+6qg=
9 . 4
Criptografia com PHP
@vcampitelli
stringstring openssl_decryptopenssl_decrypt(( stringstring $data$data ,,
stringstring $method$method ,, stringstring $key$key [[,, intint
$options$options == 00 [[,, stringstring $iv$iv == """" [[,, stringstring
$tag$tag == """" [[,, stringstring $aad$aad == """" ]]]]]]]] ))
9 . 5
Criptografia com PHP
@vcampitelli
// $key e $iv devem ser os mesmos usados no openssl_encrypt()// $key e $iv devem ser os mesmos usados no openssl_encrypt()
// Uma forma de passar o IV é enviá-lo junto com o texto cifrado// Uma forma de passar o IV é enviá-lo junto com o texto cifrado
// Por exemplo: $data = $iv . $crypt;// Por exemplo: $data = $iv . $crypt;
$ivLength$ivLength == openssl_cipher_iv_lengthopenssl_cipher_iv_length(('aes-256-ctr''aes-256-ctr'));;
$iv$iv == substrsubstr(($data$data,, 00,, $ivLength$ivLength));;
$crypt$crypt == substrsubstr(($data$data,, $ivLength$ivLength));;
openssl_decryptopenssl_decrypt(($crypt$crypt,, 'aes-256-ctr''aes-256-ctr',, $key$key,, 00,, $iv$iv));;
9 . 6
Criptografia com PHP
@vcampitelli
HASHINGHASHING
10 . 1
Criptografia com PHP
@vcampitelli
é uma função que mapeia dados de
tamanho arbitrário para dados de
tamanho xo
10 . 2
Criptografia com PHP
@vcampitelli
TIMING ATTACKSTIMING ATTACKS
Side-channel attackSide-channel attack que analisa o tempo de execuçãoque analisa o tempo de execução
de algoritmos de criptografiade algoritmos de criptografia
10 . 3
Criptografia com PHP
@vcampitelli
stringstring hashhash(( stringstring $algo$algo ,, stringstring $data$data [[,,
boolbool $raw_output$raw_output == falsefalse ]]))
hashhash(('sha256''sha256',, 'phpconf@2017''phpconf@2017'));;
// f32b98cc1a6ed7e0614e5ee8fdf8142ea6b9b12a8c487aa6e269d220d93669// f32b98cc1a6ed7e0614e5ee8fdf8142ea6b9b12a8c487aa6e269d220d93669
10 . 4
Criptografia com PHP
@vcampitelli
boolbool hash_equalshash_equals(( stringstring $known_string$known_string ,,
stringstring $user_string$user_string ))
$userHash$userHash == hashhash(('sha256''sha256',, $postedData$postedData));;
ifif ((hash_equalshash_equals(($storedHash$storedHash,, $userHash$userHash)))) {{ ...... }}
10 . 5
Criptografia com PHP
@vcampitelli
stringstring password_hashpassword_hash(( stringstring $password$password ,,
intint $algo$algo [[,, arrayarray $options$options ]] ))
password_hashpassword_hash(('phpconf@2017''phpconf@2017',, PASSWORD_DEFAULTPASSWORD_DEFAULT,, [['cost''cost' ==>> 1212]]));;
// $2y$12$m.GZEOwitahX7JIq7ulvWeR54AMT/SEg1TVh74iijsjTXT0LZRQ2q// $2y$12$m.GZEOwitahX7JIq7ulvWeR54AMT/SEg1TVh74iijsjTXT0LZRQ2q
10 . 6
Criptografia com PHP
@vcampitelli
boolbool password_verifypassword_verify(( stringstring $password$password ,,
stringstring $hash$hash ))
ifif ((password_verifypassword_verify(($postedPassword$postedPassword,, $storedHash$storedHash)))) {{ ...... }}
10 . 7
Criptografia com PHP
@vcampitelli
ARGON2 NO PHP 7.2ARGON2 NO PHP 7.2
Vencedor do
(2015)
Versão Argon2i, otimizada para side-channel
attacks
Constante PASSWORD_ARGON2I
Opções
memory_cost: memória máxima (bytes)
time_cost: tempo máximo para o cálculo
threads: número de threads
Password Hashing Competition
10 . 8
Criptografia com PHP
@vcampitelli
MÁS PRÁTICASMÁS PRÁTICAS
md5() - colisões e velocidade
sha1() - colisão ( )
=== - timing attack
shattered.io
10 . 9
Criptografia com PHP
@vcampitelli
ASSINATURASASSINATURAS
11 . 1
Criptografia com PHP
@vcampitelli
esquema matemático para demonstrar
a autenticidade de uma mensagem
11 . 2
Criptografia com PHP
@vcampitelli
OPENSSLOPENSSL
Disponível a partir do PHP 5.3
Algoritmos disponíveis:
ou openssl_get_md_methods()
http://php.net/manual/en/openssl.signature-
algos.php
11 . 3
Criptografia com PHP
@vcampitelli
boolbool openssl_signopenssl_sign(( stringstring $data$data ,, stringstring
&&$signature$signature ,, mixedmixed $priv_key_id$priv_key_id [[,, mixedmixed
$signature_alg$signature_alg == OPENSSL_ALGO_SHA1OPENSSL_ALGO_SHA1 ]] ))
$privateKey$privateKey == openssl_pkey_get_privateopenssl_pkey_get_private(('file:///path/to/key.pem''file:///path/to/key.pem'))
openssl_signopenssl_sign(($data$data,, $signature$signature,, $privateKey$privateKey,, OPENSSL_ALGO_SHA256OPENSSL_ALGO_SHA256))
// $signature = j�C^�)�L}� K���^ �~C3���l��&�l.��.�(�// $signature = j�C^�)�L}� K���^ �~C3���l��&�l.��.�(�
// Para converter, usar base64_encode() ou bin2hex()// Para converter, usar base64_encode() ou bin2hex()
11 . 4
Criptografia com PHP
@vcampitelli
intint openssl_verifyopenssl_verify(( stringstring $data$data ,, stringstring
$signature$signature ,, mixedmixed $pub_key_id$pub_key_id [[,, mixedmixed
$signature_alg$signature_alg == OPENSSL_ALGO_SHA1OPENSSL_ALGO_SHA1 ]] ))
$pubKey$pubKey == openssl_pkey_get_publicopenssl_pkey_get_public(('file://path/to/cert.pem''file://path/to/cert.pem'));;
openssl_verifyopenssl_verify(($data$data,, $signature$signature,, $pubKey$pubKey,, 'sha256WithRSAEncrypti'sha256WithRSAEncrypti
// Retorna 1 ou 0 se a assinatura for válida ou não// Retorna 1 ou 0 se a assinatura for válida ou não
// Caso haja algum erro, retorna -1// Caso haja algum erro, retorna -1
11 . 5
Criptografia com PHP
@vcampitelli
HMACHMAC
Hash-based Message Authentication Code
Algoritmos disponíveis: hash_hmac_algos()
11 . 6
Criptografia com PHP
@vcampitelli
stringstring hash_hmachash_hmac(( stringstring $algo$algo ,, stringstring
$data$data ,, stringstring $key$key [[,, boolbool $raw_output$raw_output ==
falsefalse ]] ))
hash_hmachash_hmac(('sha256''sha256',, 'PHP Conference 2017''PHP Conference 2017',, '+0FcB5@#:vb;%''+0FcB5@#:vb;%'));;
// 8486e5da2bd373ac77af77f966088aedeec2481f73c32c82cead64715be5a4// 8486e5da2bd373ac77af77f966088aedeec2481f73c32c82cead64715be5a4
11 . 7
Criptografia com PHP
@vcampitelli
boolbool hash_equalshash_equals(( stringstring $known_string$known_string ,,
stringstring $user_string$user_string ))
hash_equalshash_equals(($hashFromDb$hashFromDb,, hashhash(('sha256''sha256',, $postedData$postedData))));;
11 . 8
Criptografia com PHP
@vcampitelli
MÁS PRÁTICASMÁS PRÁTICAS
md5() - colisões e velocidade
sha1() - colisão ( )
=== - timing attack
shattered.io
11 . 9
Criptografia com PHP
@vcampitelli
UTILIDADESUTILIDADES
12 . 1
Criptografia com PHP
@vcampitelli
CRYPTOOLCRYPTOOL
CrypToolCrypTool
Criptografia com PHP
@vcampitelli 12 . 2
Criptografia com PHP
@vcampitelli
LIBSODIUMLIBSODIUM
Biblioteca moderna para criptografia, assinaturas
e hashing
Incorporada no PHP 7.2 ( )manual
PHP 7.2: The First Programming Language to Add
Modern Cryptography to its Standard Library
12 . 3
Criptografia com PHP
@vcampitelli
GERANDO CHAVES SIMÉTRICAS SEGURASGERANDO CHAVES SIMÉTRICAS SEGURAS
pwgenpwgen --sy1sy1 3232
12 . 4
Criptografia com PHP
@vcampitelli
GERANDO PAR DE CHAVES RSAGERANDO PAR DE CHAVES RSA
openssl genrsaopenssl genrsa --outout privateprivate..keykey 20482048
# Generating RSA private key, 2048 bit long modulus# Generating RSA private key, 2048 bit long modulus
openssl rsaopenssl rsa --inin privateprivate..keykey --outformoutform PEMPEM --puboutpubout --outout publicpublic..pempem
# writing RSA key# writing RSA key
12 . 5
Criptografia com PHP
@vcampitelli
OBRIGADO!OBRIGADO!
GitHub:
Twitter:
Slides:
Vagas:
@vcampitelli
@vcampitelli
vcampitelli.github.io
vagas@mt4.com.br
13

Criptografia com PHP