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

Mettre la cryptographie au service de vos apps Symfony

Nicolas Grekas
September 24, 2020

Mettre la cryptographie au service de vos apps Symfony

Hacher les mots de passe, chiffrer les clefs applicatives, voire chiffrer les données elles-mêmes.
Les dernières versions de Symfony mettent tous les outils nécessaires à disposition pour protéger vos utilisateurs contre les fuites ou autres vols de données.

SHA512, Argon2id, BLAKE2/3, ChaCha20-Poly1305, etc. derrière ces noms barbares se cachent des algorithmes qui fondent les nouveaux standards de protection de la vie privée.
Depuis PHP 7.2, l'extension "sodium" donne accès sans difficulté à toute l'intelligence des spécialistes en cryptographie.
Son API volontairement simplifiée est un trésor pour le reste du monde. Tout y est.

Lors de cette conférence, je vous propose de démystifier ces outils et l'utilisation qui en est faite dans Symfony.

Nicolas Grekas

September 24, 2020
Tweet

More Decks by Nicolas Grekas

Other Decks in Technology

Transcript

  1. Mettre la cryptographie
    au service de vos apps Symfony
    #Symfony_Live
    @nicolasgrekas

    View Slide

  2. @nicolasgrekas

    View Slide

  3. Le cryptographie
    • Hacher – à sens unique
    • Chiffrer – réversible
    • Intégrité et confidentialité
    • Stocker et transmettre des données

    View Slide

  4. Hachez menu
    ces mots de passe

    View Slide

  5. Les menaces
    • Fuite de données personnelles
    Inadvertance ou malveillance
    • Usurpation d’identité sur votre site
    Préjudice au client et/ou au business
    (demande de droit d’accès RGDP)
    • Réutilisation sur des sites tiers
    Partage de mots de passe entre sites

    View Slide

  6. Vous ne voulez pas
    connaître les mots
    de passe de vos
    utilisateurs !
    @nicolasgrekas

    View Slide

  7. Mot de passe = jamais en clair, ni chiffré
    echo strlen('123456');
    // 6
    echo hash('crc32', '123456');
    // 158520161
    echo hash('md5', '123456');
    // e10adc3949ba59abbe56e057f20f883e
    echo hash('sha256', '123456');
    // 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

    View Slide

  8. Empreinte cryptographique = preuve d’intégrité
    • Pas de collision connue
    • Économiquement exorbitant à inverser
    • e10adc3949ba59abbe56e057f20f883e?
    • md5(), sha1()
    • Force brute

    View Slide

  9. Salez les mots de passe
    $sel = bin2hex(random_bytes(8));
    $empreinte = $sel.hash('sha256', $sel.$mdp);
    security:
    encoders:
    App\Entity\User:
    algorithm: sha256

    View Slide

  10. Augmentez le coût en force brute
    $sel = bin2hex(random_bytes(8));
    $empreinte = $sel.hash('sha256', $sel.$mdp);
    $empreinte = $sel.hash('sha256', $sel.$empreinte);
    $empreinte = $sel.hash('sha256', $sel.$empreinte);
    $empreinte = $sel.hash('sha256', $sel.$empreinte);
    $empreinte = $sel.hash('sha256', $sel.$empreinte);
    $empreinte = $sel.hash('sha256', $sel.$empreinte);
    $empreinte = $sel.hash('sha256', $sel.$empreinte);
    $empreinte = $sel.hash('sha256', $sel.$empreinte);
    security:
    encoders:
    App\Entity\User:
    algorithm: pbkdf2
    hash_algorithm: sha256
    iterations: 5000

    View Slide

  11. Bcrypt à la rescousse
    echo password_hash('123456', PASSWORD_BCRYPT, ['cost' => 10]);
    // $2y$10$YHtTDQEjxSIr.UCLmj/JD.VN7UD4hMBOtJNzfdjxW3s1TmcMyaOYK
    security:
    encoders:
    App\Entity\User:
    algorithm: bcrypt
    cost: 10

    View Slide

  12. View Slide

  13. Argon2[id]
    • $argon2id$v=19$m=65536,t=4,p=1
    • m=memory
    t=time
    p=parallel
    • Argon2i = anti calcul vectoriel
    Argon2d = anti canal auxiliaire
    Argon2id = mixe les deux

    View Slide

  14. Argon2[id]
    echo password_hash('123456', PASSWORD_ARGON2ID);
    // $argon2id$v=19$m=65536,t=4,p=1$OXhtdDFSLnViTS5zdWx2eQ$OdhFoYQAyyoL
    security:
    encoders:
    App\Entity\User:
    algorithm: sodium

    View Slide

  15. L’algo parfait est
    celui de demain
    @nicolasgrekas

    View Slide

  16. BLAKE 3

    View Slide

  17. BLAKE 3

    View Slide

  18. Vivre dans l’air du temps
    • MigratingPasswordEncoder
    • PasswordUpgraderInterface
    security:
    encoders:
    App\Entity\User:
    algorithm: auto
    # ou #
    algorithm: sodium
    migrate_from: bcrypt

    View Slide

  19. PasswordUpgraderInterface <3 MakerBundle
    // ...
    use Symfony\Component\Security\Core\User\PasswordUpgraderInterface as PUI;
    class UserRepository extends EntityRepository implements PUI
    {
    // ...
    public function upgradePassword(UserInterface $user, string $newPassword)
    {
    $user->setPassword($newPassword);
    $this->getEntityManager()->flush($user);
    }
    }

    View Slide

  20. L’Argon2[id] du futur
    • $argon2id$v=19$m=999999,t=99,p=1
    • Empreintes auto-descriptives = migrations à loisir
    • Quels paramètres adopter?

    View Slide

  21. Comment régler l’algorithme?
    • 0.5s à 1s de calcul
    • Mémoire X nombre de processus PHP

    View Slide

  22. Votre infra
    vient de tomber
    @nicolasgrekas

    View Slide

  23. Isoler les calculs
    d’empreinte du reste
    de l’application
    @nicolasgrekas

    View Slide

  24. • Pool FPM dédié
    • Auth0, Google Connect,
    Facebook Connect, Amazon Cognito
    • Keycloak
    • protocoles aPAKE, SPAKE2+EE
    • WebAuthn
    Isoler le calcul des empreintes

    View Slide

  25. Chiffrer
    ses secrets

    View Slide

  26. • Symétrique
    une même clef pour chiffrer et déchiffrer
    • Asymétrique
    une clef pour chiffrer, une autre pour déchiffrer
    Chiffrer = réversible

    View Slide

  27. Libsodium, natif depuis PHP 7.2
    sodium_crypto_secretbox_*();
    sodium_crypto_box_*();
    sodium_crypto_generichash_*();
    sodium_crypto_pwhash_*();
    sodium_crypto_sign_*();
    sodium_crypto_auth_*();
    etc.
    https://jolicode.com/blog/what-libsodium-can-do-for-you-an-introduction-to-cryptography-in-php

    View Slide

  28. Chiffrement symétrique
    $key = sodium_crypto_secretbox_keygen();
    $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
    $encrypted = sodium_crypto_secretbox('my secret data', $nonce, $key);
    //...
    $decrypted = sodium_crypto_secretbox_open($encrypted, $nonce, $key);

    View Slide

  29. Chiffrement asymétrique
    $keyPair = sodium_crypto_box_keypair();
    $privateKey = sodium_crypto_box_secretkey($keyPair);
    $publicKey = sodium_crypto_box_publickey($keyPair);
    $encrypted = sodium_crypto_box_seal('my secret data', $publicKey);
    $decrypted = sodium_crypto_box_seal_open($encrypted, $keyPair);

    View Slide

  30. @nicolasgrekas
    > config/secrets/dev/dev.GITHUB_API_TOKEN.aebb6a.php

    View Slide

  31. @nicolasgrekas
    $ cat config/secrets/dev/dev.GITHUB_API_TOKEN.aebb6a.php
    return "d\x9B\x5D2\xABV\x0B\xE6\xB1\xC2\x25\xCB\x2B\xDAkA\xE4\xC7\x9Cu\x

    View Slide

  32. @nicolasgrekas
    > config/secrets/prod/prod.decrypt.private.php

    View Slide

  33. Commitez vos secrets!
    (sauf la master key)
    @nicolasgrekas

    View Slide

  34. @nicolasgrekas
    framework:
    secrets:
    vault_directory: '%kernel.project_dir%/config/secrets/%kernel.environment%'
    decryption_env_var: 'base64:default::SYMFONY_DECRYPTION_SECRET'
    export SYMFONY_DECRYPTION_SECRET=$(php -r 'echo base64_encode( \
    require "config/secrets/prod/prod.decrypt.private.php" );')
    Configurer son app Symfony

    View Slide

  35. View Slide

  36. View Slide

  37. •michaeldegroot/DoctrineEncryptBundle
    Encrypted symfony entity's by verified and standardized libraries
    •paragonie/halite
    High-level cryptography interface powered by libsodium
    Encrypter toutes les données
    Symmetric\Crypto::encrypt() / decrypt()
    Asymmetric\Crypto::seal() / unseal()
    Asymmetric\Crypto::encrypt / decrypt()
    Symmetric\Crypto::authenticate() / verify()
    Asymmetric\Crypto::sign() / verify()

    View Slide

  38. RGDP
    Les données personnelles

    View Slide

  39. RGPD
    • La preuve incombe aux entreprises!
    La CNIL a déjà fermé plusieurs startups – 10M€ ou 2% du CA
    • Chiffrement
    Une fuite n’est plus à notifier à la CNIL ni aux utilisateurs
    The authorities must positively consider the use of
    encryption in their decision on whether and what amount
    a fine is imposed as per Art. 83(2)(c) of the GDPR.

    View Slide

  40. Risques typiques
    • Accès distant
    • Transmissions non sécurisées
    • Hébergement partagé
    • Erreur de configuration serveur
    • Turn over
    • Mauvais cloisonnement des accès
    • Corruption d’archives
    • etc.

    View Slide

  41. Solutions typiques
    • Chiffrement des données
    • Cryptographie asymétrique
    • Rotation des clefs
    • Documenter et simplifier
    • etc.

    View Slide

  42. Le législateur aligne
    l’éthique et la technologie \o/

    View Slide

  43. View Slide