Slide 1

Slide 1 text

libsodium no PHP 7.2 @vcampitelli LIBSODIUM NO PHP 7.2 LIBSODIUM NO PHP 7.2 1

Slide 2

Slide 2 text

libsodium no PHP 7.2 @vcampitelli QUEM SOU EU? QUEM SOU EU? Vinícius Campitelli • MT4 Tecnologia • @MediaPost • Curseduca vcampitelli.github.io 2

Slide 3

Slide 3 text

libsodium no PHP 7.2 @vcampitelli O QUE É CRIPTOGRAFIA? O QUE É CRIPTOGRAFIA? 3 . 1

Slide 4

Slide 4 text

libsodium no PHP 7.2 @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

Slide 5

Slide 5 text

libsodium no PHP 7.2 @vcampitelli Texto claro → Texto cifrado 3 . 3

Slide 6

Slide 6 text

libsodium no PHP 7.2 @vcampitelli TIPOS DE CRIPTOGRAFIA TIPOS DE CRIPTOGRAFIA 4 . 1

Slide 7

Slide 7 text

libsodium no PHP 7.2 @vcampitelli SIMÉTRICA SIMÉTRICA Utiliza uma mesma chave para criptografar e descriptografar os textos 5 . 1

Slide 8

Slide 8 text

libsodium no PHP 7.2 @vcampitelli public function encrypt($data) { $iv = openssl_random_pseudo_bytes( openssl_cipher_iv_length('aes-256-ctr') ); return base64_encode( $iv . openssl_encrypt( $data, 'aes-256-ctr', '@rw97`b#1,EquJ[L2P2', OPENSSL_RAW_DATA, $iv ) ); } 5 . 2

Slide 9

Slide 9 text

libsodium no PHP 7.2 @vcampitelli public function decrypt($data) { $data = base64_decode($data); $ivSize = openssl_cipher_iv_length('aes-256-ctr'); $iv = substr($data, 0, $ivSize); $data = substr($data, $ivSize); return openssl_decrypt( $data, 'aes-256-ctr', '@rw97`b#1,EquJ[L2P2', OPENSSL_RAW_DATA, $iv ); } 5 . 3

Slide 10

Slide 10 text

libsodium no PHP 7.2 @vcampitelli ASSIMÉTRICA ASSIMÉTRICA Chave pública: utilizada para criptografar (escrever) Chave privada: utilizada para descriptografar (ler) 6 . 1

Slide 11

Slide 11 text

libsodium no PHP 7.2 @vcampitelli public function encrypt($data, $publicKey) { $public = openssl_get_publickey($publicKey); openssl_public_encrypt($data, $crypted, $public); return $crypted; } 6 . 2

Slide 12

Slide 12 text

libsodium no PHP 7.2 @vcampitelli public function decrypt($data, $privateKey, $passphrase) { $key = openssl_pkey_get_private($privateKey, $passphrase); openssl_private_decrypt($data, $decrypted, $key); return $decrypted; } 6 . 3

Slide 13

Slide 13 text

libsodium no PHP 7.2 @vcampitelli Tenho certeza que ao invés de omitir o parâmetro nos códigos anteriores, todos usam , certo? $padding OPENSSL_PKCS1_OAEP_PADDING 6 . 4

Slide 14

Slide 14 text

libsodium no PHP 7.2 @vcampitelli A nal, é claro que o parâmetro default ( ) utiliza o padrão PKCS#1 v1.5, que é vulnerável a Padding attacks. OPENSSL_PKCS1_PADDING 6 . 5

Slide 15

Slide 15 text

libsodium no PHP 7.2 @vcampitelli E sabemos que o algoritmo RSA com uma chave de 2048 bits só consegue processar dados de até 214 bytes. 6 . 6

Slide 16

Slide 16 text

libsodium no PHP 7.2 @vcampitelli HASHING HASHING é uma função que mapeia dados de tamanho arbitrário para dados de tamanho xo 7 . 1

Slide 17

Slide 17 text

libsodium no PHP 7.2 @vcampitelli MAS EU JÁ SEI USAR HASH! MAS EU JÁ SEI USAR HASH! if (hash('sha512', $_POST['password']) !== $senhaDoBanco) { throw new InvalidCredentialsException('Senha não confere!'); } 7 . 2

Slide 18

Slide 18 text

libsodium no PHP 7.2 @vcampitelli E VOCÊ SABE O QUE É TIMING ATTACK? E VOCÊ SABE O QUE É TIMING ATTACK? 7 . 3

Slide 19

Slide 19 text

libsodium no PHP 7.2 @vcampitelli E VOCÊ SABE O QUE É TIMING ATTACK? E VOCÊ SABE O QUE É TIMING ATTACK? ataque que explora operações que não possuem tempo constante 7 . 3

Slide 20

Slide 20 text

libsodium no PHP 7.2 @vcampitelli LIBSODIUM LIBSODIUM Biblioteca incorporada no PHP 7.2 Site o cial: Biblioteca PHP: GitHub da biblioteca PHP: libsodium.org pecl libsodium libsodium-php 8 . 1

Slide 21

Slide 21 text

libsodium no PHP 7.2 @vcampitelli ENCRYPT ENCRYPT // Lê a chave $key = trim(file_get_contents('02-encrypt.key')); // Gera um nonce $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); // Prefixa o nonce aos dados para poder ser recuperado pelo decryp $ciphertext = sodium_bin2hex( $nonce . sodium_crypto_secretbox($plaintext, $nonce, $key) ); // 7641ab3d68fedf4c52cc026aa1dcf611575a5843058483d281efa95b1577ed 9 . 1

Slide 22

Slide 22 text

libsodium no PHP 7.2 @vcampitelli DECRYPT DECRYPT $ciphertext = sodium_hex2bin($ciphertext); // Lê a chave $key = trim(file_get_contents('02-encrypt.key')); // Separa o nonce do texto $nonce = substr($ciphertext, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTE $ciphertext = substr($ciphertext, SODIUM_CRYPTO_SECRETBOX_NONCEBY // Descriptografa $plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $k 9 . 2

Slide 23

Slide 23 text

libsodium no PHP 7.2 @vcampitelli ASSINATURA ASSINATURA esquema matemático para demonstrar a autenticidade de uma mensagem 10 . 1

Slide 24

Slide 24 text

libsodium no PHP 7.2 @vcampitelli ASSINATURA ASSINATURA // Lê a chave $key = trim(file_get_contents('03-auth.key')); // Gera a assinatura para o $ciphertext $auth = sodium_bin2hex(sodium_crypto_auth($ciphertext, $key)); 10 . 2

Slide 25

Slide 25 text

libsodium no PHP 7.2 @vcampitelli ASSINATURA - VALIDANDO ASSINATURA - VALIDANDO $auth = sodium_hex2bin($auth); // Lê a chave $key = trim(file_get_contents('03-auth.key')); // Verifica a assinatura return sodium_crypto_auth_verify($auth, $ciphertext, $key); 10 . 3

Slide 26

Slide 26 text

libsodium no PHP 7.2 @vcampitelli CRYPTO BOX CRYPTO BOX // Servidor 1 - Alice $aliceKeyPair = sodium_crypto_box_keypair(); $alicePublic = sodium_crypto_box_publickey($aliceKeyPair); $aliceSecret = sodium_crypto_box_secretkey($aliceKeyPair); // Servidor 2 - Bob $bobKeyPair = sodium_crypto_box_keypair(); $bobPublic = sodium_crypto_box_publickey($bobKeyPair); $bobSecret = sodium_crypto_box_secretkey($bobKeyPair); 11 . 1

Slide 27

Slide 27 text

libsodium no PHP 7.2 @vcampitelli CRYPTO BOX - ALICE CRYPTO BOX - ALICE $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES); $key = sodium_crypto_box_keypair_from_secretkey_and_publickey( $aliceSecret, $bobPublic ); $encrypted = sodium_crypto_box($message, $nonce, $key); $ciphertext = $nonce . $encrypted; 11 . 2

Slide 28

Slide 28 text

libsodium no PHP 7.2 @vcampitelli CRYPTO BOX - BOB CRYPTO BOX - BOB $nonce = substr($ciphertext, 0, SODIUM_CRYPTO_BOX_NONCEBYTES); $ciphertext = substr($ciphertext, SODIUM_CRYPTO_BOX_NONCEBYTES); $key = sodium_crypto_box_keypair_from_secretkey_and_publickey( $bobSecret, $alicePublic ); echo sodium_crypto_box_open($encrypted, $nonce, $key); 11 . 3

Slide 29

Slide 29 text

libsodium no PHP 7.2 @vcampitelli PERSISTINDO SENHAS PERSISTINDO SENHAS sodium_crypto_pwhash_str( $password, SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE ); // $argon2id$v=19$m=65536,t=2,p=1$20H8uU9EFq7GO2NFPrfDyg$Om/qimxz 12 . 1

Slide 30

Slide 30 text

libsodium no PHP 7.2 @vcampitelli VALIDANDO SENHAS VALIDANDO SENHAS sodium_crypto_pwhash_str_verify( $storedPassword, $inputPassword ); 12 . 2

Slide 31

Slide 31 text

libsodium no PHP 7.2 @vcampitelli OBRIGADO! OBRIGADO! GitHub: Twitter: Slides: @vcampitelli @vcampitelli vcampitelli.github.io 13