$30 off During Our Annual Pro Sale. View Details »

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
    LIBSODIUM NO PHP 7.2
    LIBSODIUM NO PHP 7.2
    1

    View Slide

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

    View Slide

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

    View Slide

  4. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. 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

    View Slide

  9. 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

    View Slide

  10. 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

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

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

    View Slide

  19. 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

    View Slide

  20. 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

    View Slide

  21. 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

    View Slide

  22. 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

    View Slide

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

    View Slide

  24. 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

    View Slide

  25. 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

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

  29. 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

    View Slide

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

    View Slide

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

    View Slide