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

Avatar for Vinícius Campitelli

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