# Projet Secu Web : Partage de fichiers > Partage de fichiers : une application web proposant à ses usagers de mettre en partage des fichiers avec un chiffrement côté utilisateur (type MEGA). Il y a possibilité de creuser au niveau des fonctionnalités de contrôle d'accès, de la mise en oeuvre du chiffrement, de la gestion des clés... ![zeroshare](https://hackmd.io/_uploads/H1ygltbxR.png) Guide des choix cryptographiques de l'ANSII, lsite des trucs pas mal, permettant d'orienter les choix de design Zero knowledge: le service provider ne voit transiter que des données chiffrées coté client. Idée: On stocke sur le serveur: - les fichiers chiffrés - les clés publiques des users - les clés privée chiffrées à partir d'un mot de passe des users (pas de dérivation de clé en local, c'est un enfer) #### Dérivation de clé: Avantages: - pas besoin de stocker la clé privée sur le serveur, mais en soit pas super grave si chiffrée - pas besoin de fetch la clé du serveur Inconvénient: - 1 mdp <=> 1 clé. Pas possible de changer de mdp sans changer de clé, et pas possible de changer la clé sans changer le mdp - On peut pas rotate facilement la clé - On peut pas changer facilement le mdp - Chiffrement symétrique des fichiers: AES, quel mode ? ```mermaid flowchart TD A(Alice) F(File) N(fa:fa-database Nonce) K(Encryption Key) AES_E(AES Encryption) CK(fa:fa-database Cyphered Key) CF(fa:fa-database Cyphered File) AES_D(AES Decryption) DK(Decyphered Key) B_Pub(fa:fa-database Bob Public key) B_Pvt(fa:fa-database Bob Private key) subgraph Alices's side A-->N A-->F A-->K N-->AES_E F-->AES_E K-->AES_E AES_E-->CF %% Chiffrement de la clé symétrique K-->RSA_E(RSA Encryption) B_Pub-->RSA_E RSA_E-->CK end subgraph Bob's side CK-.->RSA_D B_Pvt-->RSA_D(RSA Decryption) RSA_D-->DK N-.->AES_D CF-.->AES_D DK-->AES_D AES_D-->DF(Decyphered File) end ``` Authentification d'un user, aucune idée de ce qui se passe après la comparaison => la comparaiso ```mermaid flowchart n1["Alice authenticating"] subgraph s1["client"] n2["get username"] n4["get password"] n3["hash password"] end subgraph s2["server"] n5["recover user salted hashed password"] n6["get salt for password"] n7["hash salted password"] n8["compare"] end n1 --> n2 n1 --> n4 n4 --> n3 n2 --> n5 n5 --> n6 n3 --> n7 n6 --> n7 n5 --> n8 n7 --> n8 ``` ### Architecture Front end: #### 1. Page de création de compte Formulaire de création de compte, il faut se connecter après l'avoir submit. - username (unique) - email (unique) - mot de passe maître Puis, on génère un nonce et on dérive la paire de clé publique/privée. On envoie le formulaire + le nonce et la clé publique au serveur #### 2. Page de connexion On se connecte, dans la version vulnérable en envoyant le mdp maître au serveur. #### 3. Page "mes fichiers" Liste des fichiers mis en ligne. bouton + pour ajouter des fichiers. Bouton édition pour chaque fichier (Ce bouton ne permet que de changer la liste des personnes avec qui le fichier est partagé au début). ##### 3.1 Ajout de fichier Popup sur la page "mes fichiers". Glisse un fichier sur l'onglet et donne un titre. Génère une clé de chiffrement symmétrique et utilise son nonce pour chiffrer le fichier avec AES. chiffre la clé symmétrique avec la clé publique de l'utilisateur. Envoi du fichier chiffré, de la clé symmétrique chiffrée et du titre au serveur pour créer une entrée dans la table files ##### 3.2 Edition de fichier Popup sur la page "mes fichiers". Affiche la liste de personnes ayant accès au fichier. possibilité d'entrer un username (ou email) pour le partager à celui-ci. On récupère alors la clé publique de l'utilisateur à qui on veut partager, la clé privée chiffrée de l'utilisateur qui partage, la clé symmétrique chiffrée du fichier et on chiffre la clé symmétrique du fichier avec la clé publique de l'utilisateur à qui on partage le fichier. Il faut entrer son mdp pour pouvoir déchiffrer la clé privée. On envoie alors la nouvelle clé chiffrée au serveur pour créer une nouvelle entrée dans la table shares. #### 4. Page "shared with me" Page qui affiche tous les fichiers qui ont été partagés avec nous. Bouton télécharger sur chacun des fichiers Pour télécharger, on récupère le fichier, la clé symmétrique chiffrée avec notre clé publique ainsi que notre clé privée liée à notre mdp. On entre notre mdp ce qui permet de récupérer notre clé privée et déchiffrer la clé symmétrique puis le fichier avec le nonce de l'utilisateur qui partage le fichier. | Login | Page d'authentification | | My Files | Page avec tous les fichiers qu'on partage. | | Shared With Me | Page des fichiers partagés | Backend endpoints: | Endpoint | Body | Response | | -------- | ----------- | --- | | POST /login | username, salted hashed password | auth cookie | | POST /create_user | | | GET /my_files | username | [files] | | GET /shared_files | username | [files] | | POST /file | | | POST /share | | | | | | | | | | | | | | | | |