Bonjour,
Après digestion du livre suivant https://www.editions-eni.fr/supports...-9782409006340 et de plusieurs documents de l'OWASP, je réfléchis maintenant à mettre en place tout cela.
Pour information, je travaille avec le framework web asynchrone Sanic.
Deux questions se présentent à moi :
1. D'abord, le stockage du mot de passe des utilisateurs.
Le support sera une table dans une base de données Postgresql. Je choisis de hasher les mots de passe du côté du code Python, et non directement dans la base de données (avec pgcrypto).
Evidemment, exit les md5 ou sha1, totalement périmé pour faire cela. J'envisage d'utiliser la bibliothèque passlib avec argon2 ou bcrypt. scrypt est également proposé, mais je l'ai exclus sans raison apparente. J'hésite à utiliser argon2 car cela semble très récent (trop ???), même si je lis ici et là que c'est la solution numéro un.
Avec bcrypt, il y a un système que je n'ai pas compris totalement qui permet de stocker le sel avec le hash. Il s'agirait d'un sel dynamique, qui change à chaque fois ...
L'OWASP préconise d'utiliser un sel dynamique, c'est à dire qu'il change à chaque utilisation. On fait cela par exemple en chiffrant en AES l'identifiant qui va avec le mot de passe. On obtient bien ainsi un sel différent qui change à chaque fois, mais qu'il est possible de retrouver facilement.
Pour chiffrer en AES, j'utiliserai la bibliothèque cryptography.
Donc ma solution est de concaténer l'identifiant chiffré au mot de passe puis de hasher cela en bcrypt. Qu'en pensez vous ? Est ce une bonne pratique ?
2. Ensuite, le stockage de tout ce qui est sensible dans la code. Par exemple un sel, les identifiants et mots de passe aux bases de données et autres, etc.
Mes recherches m'ont conduite principalement vers deux solutions : soit le stockage dans un fichier de configuration, soit le stockage dans des variables d'environnement.
Pensez vous à d'autres solutions ? Que pensez vous de ces solutions ci-dessus ?
Bien évidemment, si un pirate expert prend la main sur le serveur, il aura de toute façon accès aux informations sensibles, au moins en lecture, quelque soit l'endroit où on les met.
J'ai tout de même un petite idée. Et si je mettais dans un fichier séparé (par exemple avec l'aide du module configparser) les données sensibles sous un format chiffré en AES. Ensuite avec l'aide du module argparse je fais en sorte de passer en paramètre la clé de déchiffrement. Il n'y a plus alors qu'un seul secret visible et celui ci sera du côté du paramétrage du démon (sous ubuntu) pour démarrer le serveur si je ne dis pas de bêtises (je ne l'ai jamais fait encore).
Au lancement du serveur je récupère la clé et je déchiffre toutes les valeurs sensibles qui seront alors chargées en mémoire.
Qu'en pensez vous ? Quels conseils me donneriez vous ?
Merci par avance pour votre aide.
Partager