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. Le cryptographie • Hacher – à sens unique • Chiffrer

    – réversible • Intégrité et confidentialité • Stocker et transmettre des données
  2. 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
  3. Vous ne voulez pas connaître les mots de passe de

    vos utilisateurs ! @nicolasgrekas
  4. 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
  5. Empreinte cryptographique = preuve d’intégrité • Pas de collision connue

    • Économiquement exorbitant à inverser • e10adc3949ba59abbe56e057f20f883e? • md5(), sha1() • Force brute
  6. Salez les mots de passe $sel = bin2hex(random_bytes(8)); $empreinte =

    $sel.hash('sha256', $sel.$mdp); security: encoders: App\Entity\User: algorithm: sha256
  7. 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
  8. 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
  9. 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
  10. Vivre dans l’air du temps • MigratingPasswordEncoder • PasswordUpgraderInterface security:

    encoders: App\Entity\User: algorithm: auto # ou # algorithm: sodium migrate_from: bcrypt
  11. 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); } }
  12. • Pool FPM dédié • Auth0, Google Connect, Facebook Connect,

    Amazon Cognito • Keycloak • protocoles aPAKE, SPAKE2+EE • WebAuthn Isoler le calcul des empreintes
  13. • 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
  14. 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
  15. 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);
  16. 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);
  17. @nicolasgrekas $ cat config/secrets/dev/dev.GITHUB_API_TOKEN.aebb6a.php <?php // dev.GITHUB_API_TOKEN.aebb6a on Thu, 21

    Nov 2019 14:31:29 +0100 return "d\x9B\x5D2\xABV\x0B\xE6\xB1\xC2\x25\xCB\x2B\xDAkA\xE4\xC7\x9Cu\x
  18. •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()
  19. 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.
  20. 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.
  21. Solutions typiques • Chiffrement des données • Cryptographie asymétrique •

    Rotation des clefs • Documenter et simplifier • etc.