Slide 1

Slide 1 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Web Crypto API end-to-end encryption & privacy

Slide 2

Slide 2 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 3

Slide 3 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 4

Slide 4 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 5

Slide 5 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah La crypto pour les nuls développeurs

Slide 6

Slide 6 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Hachage Fonction = Input => Digest Identification unique (collision !!!), obfuscation des données, dans le cas du hash de password, salage pour ajouter de l’entropie (si salt unique et aléatoire) ○ Génération pseudo-aléatoire du salt ○ Dérivation cryptographique sur [salt + password] (genre bcrypt) ○ Stockage de tous les éléments en base ○ Stockage d'une signature HMAC du payload

Slide 7

Slide 7 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Chiffrement symétrique Chiffrement basé sur une clé unique utilisée pour chiffrer et déchiffrer (AES, Blowfish, IDEA) Hello Alice Hello Alice MTYxYWY1Yz ZmNGU3NTE3 YjMwMzQyOD IwMzk= Encrypt : secret Decrypt : secret Bob Alice

Slide 8

Slide 8 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Chiffrement asymétrique Chiffrement basé sur des paires de clés (publique / privée) (RSA) Hello Alice Hello Alice MTYxYWY1Yz ZmNGU3NTE3 YjMwMzQyOD IwMzk= Encrypt Alice public Decrypt Alice private Bob Alice

Slide 9

Slide 9 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Signature Chiffrement asymétrique inversé Permet de valider la provenance de données Hello Alice From Bob ✅ MTYxYWY1Yz ZmNGU3NTE3 YjMwMzQyOD IwMzk= Sign Bob private Verify Bob public Bob Alice

Slide 10

Slide 10 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Web Crypto API

Slide 11

Slide 11 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Web Crypto API ● Recommandation du W3C ○ https://www.w3.org/TR/WebCryptoAPI ● Version finale datant du 26 janvier 2017 ○ commencée en décembre 2012 ● Implémenté et supporté par la majorité des navigateurs This specification describes a JavaScript API for performing basic cryptographic operations in web applications, such as hashing, signature generation and verification, and encryption and decryption. Additionally, it describes an API for applications to generate and/or manage the keying material necessary to perform these operations. Uses for this API range from user or service authentication, document or code signing, and the confidentiality and integrity of communications.

Slide 12

Slide 12 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Web Crypto API

Slide 13

Slide 13 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 14

Slide 14 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Web Crypto API ArrayBufferView getRandomValues(ArrayBufferView array); Permet d’obtenir des valeurs pseudo-aléatoires cryptographiquement satisfaisantes. SubtleCrypto subtle; Promise encrypt(AlgorithmIdentifier algorithm,CryptoKey key, BufferSource data); Promise decrypt(AlgorithmIdentifier algorithm,CryptoKey key,BufferSource data); Promise sign(AlgorithmIdentifier algorithm,CryptoKey key,BufferSource data); Promise verify(AlgorithmIdentifier algorithm, CryptoKey key,BufferSource signature,BufferSource data); Promise generateKey(AlgorithmIdentifier algorithm,boolean extractable, sequence keyUsages ); Promise importKey(KeyFormat format,(BufferSource or JsonWebKey) keyData, AlgorithmIdentifier algorithm,boolean extractable,sequence keyUsages ); Promise exportKey(KeyFormat format, CryptoKey key); ...

Slide 15

Slide 15 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah window.crypto.subtle The SubtleCrypto interface provides a set of methods for dealing with low-level cryptographic primitives and algorithms. It is named SubtleCrypto to reflect the fact that many of these algorithms have subtle usage requirements in order to provide the required algorithmic security guarantees. Web Crypto API

Slide 16

Slide 16 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Algorithmes (peut-être) supportés ● dérivation de clé: PBKDF2, HKDF, DH, CONCAT, ECDH ● hachage: SHA-1, SHA-256, SHA-384, SHA-512 ● key wrapping: AES-KW, AES-GCM, AES-CFB, AES-CBC, AES-CTR, RSA-OAEP ● sign / verify: HMAC, AES-CMAC, ECDSA, RSA-PSS, RSASSA-PKCS1-v1_5 ● encrypt / decrypt: AES-GCM, AES-CBC, AES-CFB, AES-CTR, RSA-OAEP

Slide 17

Slide 17 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mais pourquoi c’est utile ?

Slide 18

Slide 18 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mais pourquoi c’est utile ? ● Globalement permet d’implémenter le chiffrement de bout en bout ○ chiffrement directement dans le client ○ utile pour implémenter des applications de type Zero knowledge architectures ● Par exemple ○ Multi-factor Authentication ○ Protected Document Exchange ○ Cloud Storage with encryption on the client ○ Document Signing ○ Data Integrity Protection ○ Secure Messaging

Slide 19

Slide 19 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Notre application de messagerie e2ee ● chiffrée de bout en bout ○ tout se passe dans le client ● n’utilise pas de local storage ou autre pour stocker la session ○ tout est dérivé du mot de de passe utilisé pour se connecter ● volontairement simple (pour des raisons pédagogiques) ○ pas de chiffrement côté serveur pour permettre d’inspecter l’état ○ pas de signature des messages ni les hash de password ○ métadonnées explicites qu’il serait facile d’éviter ● nous ne sommes pas des experts en sécurité ● surement pas à l’état de l’art ○ nous n’implémentons pas le protocole Signal ;)

Slide 20

Slide 20 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Notre application de messagerie e2ee https://github.com/mathieuancelin/devoxx-web-crypto-demo Démo

Slide 21

Slide 21 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte ● Initialisation ○ hachage bcrypt du mot de passe ■ passwordHash = bcrypt.hash(password, bcrypt.generateSalt(10)) ○ génération d’un sel propre à l’utilisateur ■ salt = bcrypt.generateSalt(10) ○ génération d’un couple de clés (publique/privée) propre à l’utilisateur ● Chiffrement de la clé privée et du sel ○ chiffrement AES du sel avec le mot de passe de l’utilisateur ■ encryptedSalt = aes.encrypt(salt, password) ○ création d’un hash bcrypt du mot de passe avec le sel pour chiffrer (AES) la clé privée avec ■ encryptedPrivateKey = aes.encrypt(privateKey, bcrypt.hash(password, salt)) ● Stockage sur le serveur ○ email, nom, clé publique, passwordHash, encryptedSalt, encryptedPrivateKey { "email": "[email protected]", "name": "Bobby Boby", "password": "$2b$2$FtXnxAf6EU", "salt": "Y2JkZmZkMTg0NWF==", "publicKey": null, "privateKey": null }

Slide 22

Slide 22 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte { "email": "[email protected]", "name": "Bobby Boby", "password": "secret", "salt": null, "publicKey": null, "privateKey": null }

Slide 23

Slide 23 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte ● Initialisation ○ hachage bcrypt du mot de passe ■ passwordHash = bcrypt.hash(password, bcrypt.generateSalt(10)) { "email": "[email protected]", "name": "Bobby Boby", "password": "$2b$2$FtXnxAf6EU", "salt": null, "publicKey": null, "privateKey": null }

Slide 24

Slide 24 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte ● Initialisation ○ hachage bcrypt du mot de passe ■ passwordHash = bcrypt.hash(password, bcrypt.generateSalt(10)) ○ génération d’un sel propre à l’utilisateur ■ salt = bcrypt.generateSalt(10) { "email": "[email protected]", "name": "Bobby Boby", "password": "$2b$2$FtXnxAf6EU", "salt": "salty salt", "publicKey": null, "privateKey": null }

Slide 25

Slide 25 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte ● Initialisation ○ hachage bcrypt du mot de passe ■ passwordHash = bcrypt.hash(password, bcrypt.generateSalt(10)) ○ génération d’un sel propre à l’utilisateur ■ salt = bcrypt.generateSalt(10) ○ génération d’un couple de clés (publique/privée) propre à l’utilisateur { "email": "[email protected]", "name": "Bobby Boby", "password": "$2b$2$FtXnxAf6EU", "salt": "salty salt", "publicKey": "a public key", "privateKey": "a private key" }

Slide 26

Slide 26 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte ● Initialisation ○ hachage bcrypt du mot de passe ■ passwordHash = bcrypt.hash(password, bcrypt.generateSalt(10)) ○ génération d’un sel propre à l’utilisateur ■ salt = bcrypt.generateSalt(10) ○ génération d’un couple de clés (publique/privée) propre à l’utilisateur ● Chiffrement de la clé privée et du sel ○ chiffrement AES du sel avec le mot de passe de l’utilisateur ■ encryptedSalt = aes.encrypt(salt, password) { "email": "[email protected]", "name": "Bobby Boby", "password": "$2b$2$FtXnxAf6EU", "salt": "wMTRhODAwYWVlYTA3Zj", "publicKey": "a public key", "privateKey": "a private key" }

Slide 27

Slide 27 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte ● Initialisation ○ hachage bcrypt du mot de passe ■ passwordHash = bcrypt.hash(password, bcrypt.generateSalt(10)) ○ génération d’un sel propre à l’utilisateur ■ salt = bcrypt.generateSalt(10) ○ génération d’un couple de clés (publique/privée) propre à l’utilisateur ● Chiffrement de la clé privée et du sel ○ chiffrement AES du sel avec le mot de passe de l’utilisateur ■ encryptedSalt = aes.encrypt(salt, password) ○ création d’un hash bcrypt du mot de passe avec le sel pour chiffrer (AES) la clé privée avec ■ encryptedPrivateKey = aes.encrypt(privateKey, bcrypt.hash(password, salt)) { "email": "[email protected]", "name": "Bobby Boby", "password": "$2b$2$FtXnxAf6EU", "salt": "wMTRhODAwYWVlYTA3Zj", "publicKey": "a public key", "privateKey": "BueD6aAB2L6" }

Slide 28

Slide 28 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors de la création du compte ● Initialisation ○ hachage bcrypt du mot de passe ■ passwordHash = bcrypt.hash(password, bcrypt.generateSalt(10)) ○ génération d’un sel propre à l’utilisateur ■ salt = bcrypt.generateSalt(10) ○ génération d’un couple de clés (publique/privée) propre à l’utilisateur ● Chiffrement de la clé privée et du sel ○ chiffrement AES du sel avec le mot de passe de l’utilisateur ■ encryptedSalt = aes.encrypt(salt, password) ○ création d’un hash bcrypt du mot de passe avec le sel pour chiffrer (AES) la clé privée avec ■ encryptedPrivateKey = aes.encrypt(privateKey, bcrypt.hash(password, salt)) ● Stockage sur le serveur ○ email, nom, clé publique, passwordHash, encryptedSalt, encryptedPrivateKey { "email": "[email protected]", "name": "Bobby Boby", "password": "$2b$2$FtXnxAf6EU", "salt": "wMTRhODAwYWVlYTA3Zj", "publicKey": "a public key", "privateKey": "BueD6aAB2L6" }

Slide 29

Slide 29 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 30

Slide 30 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 31

Slide 31 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 32

Slide 32 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lors du login ● Vérification serveur ○ couple email / bcrypt.compareSync(password, passwordHash) ○ retourne (email, nom, clé publique, passwordHash, encryptedSalt, encryptedPrivateKey) ● Déchiffrement du sel ○ salt = aes.decrypt(user.encryptedSalt, password) ● Déchiffrement de la clé privée ○ privateKey = aes.decrypt(user.encryptedPrivateKey, bcrypt.hash(password, salt)) ● On oublie le mot de passe !!!

Slide 33

Slide 33 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Envoi d’un message ● Génération d’une clé aléatoire ○ randomKey = crypto.getRandomValues() ● Chiffrement AES du contenu du message avec la clé aléatoire ○ encryptedMessage = aes.encrypt(message, randomKey) ● Chiffrement RSA de la clé aléatoire avec la clé publique du destinataire ○ encryptedRandomKey = rsa.encrypt(randomKey, alicePublicKey) ● Stockage serveur ○ (from, to, date, id, encryptedRandomKey, encryptedMessage)

Slide 34

Slide 34 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Envoi d’un message { "key": null, "content": "un message", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 35

Slide 35 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Envoi d’un message ● Génération d’une clé aléatoire (unique / message) ○ randomKey = crypto.getRandomValues() { "key": "a random value", "content": "un message", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 36

Slide 36 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Envoi d’un message ● Génération d’une clé aléatoire ○ randomKey = crypto.getRandomValues() ● Chiffrement AES du contenu du message avec la clé aléatoire ○ encryptedMessage = aes.encrypt(message, randomKey) { "key": "a random value", "content": "ZWVhOTU4ODUxZDFi", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 37

Slide 37 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Envoi d’un message ● Génération d’une clé aléatoire ○ randomKey = crypto.getRandomValues() ● Chiffrement AES du contenu du message avec la clé aléatoire ○ encryptedMessage = aes.encrypt(message, randomKey) ● Chiffrement RSA de la clé aléatoire avec la clé publique du destinataire ○ encryptedRandomKey = rsa.encrypt(randomKey, alicePublicKey) { "key": "MGQ1MTUwZTU2ZWRmNWMxY", "content": "ZWVhOTU4ODUxZDFi", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 38

Slide 38 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Envoi d’un message ● Génération d’une clé aléatoire ○ randomKey = crypto.getRandomValues() ● Chiffrement AES du contenu du message avec la clé aléatoire ○ encryptedMessage = aes.encrypt(message, randomKey) ● Chiffrement RSA de la clé aléatoire avec la clé publique du destinataire ○ encryptedRandomKey = rsa.encrypt(randomKey, alicePublicKey) ● Stockage serveur ○ (from, to, date, id, encryptedRandomKey, encryptedMessage) { "key": "MGQ1MTUwZTU2ZWRmNWMxY", "content": "ZWVhOTU4ODUxZDFi", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 39

Slide 39 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 40

Slide 40 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 41

Slide 41 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah RSA Encrypt (RSA-OAEP)

Slide 42

Slide 42 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah RSA Encrypt (RSA-OAEP)

Slide 43

Slide 43 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah AES Encrypt (AES-CTR)

Slide 44

Slide 44 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lecture d’un message ● Déchiffrement RSA de la clé aléatoire du message avec la clé privée ○ randomKey = rsa.decrypt(message.encryptedRandomKey, alicePrivateKey) ● Déchiffrement AES du contenu du message avec la clé aléatoire ○ content = aes.decrypt(message.encryptedMessage, randomKey)

Slide 45

Slide 45 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lecture d’un message { "key": "MGQ1MTUwZTU2ZWRmNWMxY", "content": "ZWVhOTU4ODUxZDFi", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 46

Slide 46 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lecture d’un message ● Déchiffrement RSA de la clé aléatoire du message avec la clé privée ○ randomKey = rsa.decrypt(message.encryptedRandomKey, alicePrivateKey) { "key": "a random value", "content": "ZWVhOTU4ODUxZDFi", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 47

Slide 47 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Lecture d’un message ● Déchiffrement RSA de la clé aléatoire du message avec la clé privée ○ randomKey = rsa.decrypt(message.encryptedRandomKey, alicePrivateKey) ● Déchiffrement AES du contenu du message avec la clé aléatoire ○ content = aes.decrypt(message.encryptedMessage, randomKey) { "key": "a random value", "content": "un message", "from": "[email protected]", "to": "[email protected]", "at": 1555451160579, "id": "Fv+mPQxNtqJpa9E28wrW2w==" }

Slide 48

Slide 48 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah RSA Decrypt (RSA-OAEP)

Slide 49

Slide 49 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah AES Decrypt (AES-CTR)

Slide 50

Slide 50 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Utilisation de la Web Crypto API https://github.com/diafygi/webcrypto-example

Slide 51

Slide 51 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Et du coup, on se lance ?

Slide 52

Slide 52 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Et du coup, on se lance ? oui et non ...

Slide 53

Slide 53 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Utilisez des librairies Il est très facile de se tromper en utilisant la Web Crypto API (comme vous l’avez vu, il faut être un peu du coin) De nombreuses librairies existent pour éviter d’avoir à gérer tout ça à la main. Parfois ce sont des wrapper de la Web Crypto API, parfois des ré-implémentations complètes ● JSEncrypt ● js-nacl ● openpgp.js ● ... https://gist.github.com/jo/8619441

Slide 54

Slide 54 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah exemple: JSEncrypt

Slide 55

Slide 55 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah

Slide 56

Slide 56 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Démo openpgp.js

Slide 57

Slide 57 text

Mathieu ANCELIN @TrevorReznik / Fedy Salah @fedysalah Questions ?