é 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
Tux original
Tux aplicando-se CBC / CTR
Tux aplicando-se ECB
Algoritmo Diffie–Hellman
Fonte: Wikipedia
random_int()
random_bytes()
openssl_random_pseudo_bytes()
rand()
e mt_rand()
não são criptograficamente segurosopenssl_cipher_iv_length()
para buscar o tamanho do IV para cada algoritmo
openssl_get_cipher_methods()
para descobrir os algoritmos disponíveis
random_bytes(openssl_cipher_iv_length('aes-256-ctr'));
// Q��A|Gh���C�M
string openssl_encrypt( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] )
$key = openssl_random_pseudo_bytes(32); // chave de 256 bits
$iv = openssl_random_pseudo_bytes(
openssl_cipher_iv_length('aes-256-ctr')
);
$data = 'Olá, PHP Conference 2017!';
$encrypted = openssl_encrypt($data, 'aes-256-ctr', $key, 0, $iv);
// LKdTM372XbDEYP6UnAWbhChZ7wxbaOt+6qg=
string openssl_decrypt( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string $tag = "" [, string $aad = "" ]]]] )
// $key e $iv devem ser os mesmos usados no openssl_encrypt()
// Uma forma de passar o IV é enviá-lo junto com o texto cifrado
// Por exemplo: $data = $iv . $crypt;
$ivLength = openssl_cipher_iv_length('aes-256-ctr');
$iv = substr($data, 0, $ivLength);
$crypt = substr($data, $ivLength);
openssl_decrypt($crypt, 'aes-256-ctr', $key, 0, $iv);
é uma função que mapeia dados de tamanho arbitrário para dados de tamanho fixo
Side-channel attack que analisa o tempo de execução de algoritmos de criptografia
string hash( string $algo , string $data [, bool $raw_output = false ])
hash('sha256', 'phpconf@2017');
// f32b98cc1a6ed7e0614e5ee8fdf8142ea6b9b12a8c487aa6e269d220d9366972
bool hash_equals( string $known_string , string $user_string )
$userHash = hash('sha256', $postedData);
if (hash_equals($storedHash, $userHash)) { ... }
string password_hash( string $password , int $algo [, array $options ] )
password_hash('phpconf@2017', PASSWORD_DEFAULT, ['cost' => 12]);
// $2y$12$m.GZEOwitahX7JIq7ulvWeR54AMT/SEg1TVh74iijsjTXT0LZRQ2q
bool password_verify( string $password , string $hash )
if (password_verify($postedPassword, $storedHash)) { ... }
PASSWORD_ARGON2I
memory_cost
: memória máxima (bytes)time_cost
: tempo máximo para o cálculothreads
: número de threadsmd5()
- colisões e velocidadesha1()
- colisão (shattered.io)===
- timing attackesquema matemático para demonstrar a autenticidade de uma mensagem
openssl_get_md_methods()
bool openssl_sign( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
$privateKey = openssl_pkey_get_private('file:///path/to/key.pem');
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
// $signature = j�C^�)�L}�K���^�~C3���l��&�l.��.�(�;�]...
// Para converter, usar base64_encode() ou bin2hex()
int openssl_verify( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
$pubKey = openssl_pkey_get_public('file://path/to/cert.pem');
openssl_verify($data, $signature, $pubKey, 'sha256WithRSAEncryption');
// Retorna 1 ou 0 se a assinatura for válida ou não
// Caso haja algum erro, retorna -1
hash_hmac_algos()
string hash_hmac( string $algo , string $data , string $key [, bool $raw_output = false ] )
hash_hmac('sha256', 'PHP Conference 2017', '+0FcB5@#:vb;%');
// 8486e5da2bd373ac77af77f966088aedeec2481f73c32c82cead64715be5a47c
bool hash_equals( string $known_string , string $user_string )
hash_equals($hashFromDb, hash('sha256', $postedData));
md5()
- colisões e velocidadesha1()
- colisão (shattered.io)===
- timing attackpwgen -sy1 32
openssl genrsa -out private.key 2048
# Generating RSA private key, 2048 bit long modulus
openssl rsa -in private.key -outform PEM -pubout -out public.pem
# writing RSA key