Slides: https://viniciuscampitelli.com/slides/criptografia-php/
Criptografia é a prática (e o estudo) que consiste em transformar uma informação (texto claro) em um código cifrado, para que apenas as pessoas (ou em nosso caso, sistemas) escolhidos possam decifrar. Pontos que serão abordados:
- Tipos de criptografia (simétrica e assimétrica)
- Vetores de inicialização, cifras e modos de operação
- (Bons) Geradores de aleatoriedade
- Hashing
- Garantindo autenticidade via assinaturas (HMAC)
4. 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
10. 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
11. 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
12. 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
13. 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
24. 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
31. 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
34. 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
39. 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
40. 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
45. 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