Upgrade to Pro — share decks privately, control downloads, hide ads and more …

libsodium no PHP 7

libsodium no PHP 7

Link dos slides: https://viniciuscampitelli.com/slides/libsodium-php

A libsodium é uma biblioteca moderna de criptografia e foi incluída no core do PHP 7.2, o que representa um posicionamento muito interessante da comunidade no quesito de segurança. Veremos como utilizar essa lib para:
- Prevenção de timing attacks
- Criptografia simétrica (secret key)
- Criptografia assimétrica (par de chaves: pública e privada)
- Hashing para autenticidade de mensagens e criação de senhas
- Criptografia com autenticidade
- Troca de chaves utilizando o algoritmo Diffie-Hellman
- Overview da criptografia de curvas elípticas

Vinícius Campitelli

April 14, 2018
Tweet

More Decks by Vinícius Campitelli

Other Decks in Programming

Transcript

  1. libsodium no PHP 7.2 @vcampitelli QUEM SOU EU? QUEM SOU

    EU? Vinícius Campitelli • MT4 Tecnologia • @MediaPost • Curseduca vcampitelli.github.io 2
  2. 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
  3. libsodium no PHP 7.2 @vcampitelli SIMÉTRICA SIMÉTRICA Utiliza uma mesma

    chave para criptografar e descriptografar os textos 5 . 1
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. libsodium no PHP 7.2 @vcampitelli E VOCÊ SABE O QUE

    É TIMING ATTACK? E VOCÊ SABE O QUE É TIMING ATTACK? 7 . 3
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. libsodium no PHP 7.2 @vcampitelli OBRIGADO! OBRIGADO! GitHub: Twitter: Slides:

    @vcampitelli @vcampitelli vcampitelli.github.io 13