Dis tonton, comment ça fonc­tionne la sécu­rité d’un gestion­naire de mots de passe ? — Intro­duc­tion cryp­to­gra­phique

Il y a peut-être des erreurs, proba­ble­ment des mauvais termes, certai­ne­ment des fautes ou mauvaises formu­la­tions. Vous êtes bien­ve­nus à parti­ci­per en propo­sant des correc­tions.


L’idée de base : Tous les mots de passe sont chif­frés. Personne d’autre que vous ne peut les relire sans votre accord. Ni le serveur sur lequel vous les envoyez, ni quelqu’un qui a accès au disque où vous les stockez, ni quelqu’un qui a ponc­tuel­le­ment accès à votre poste de travail.

Chif­frer c’est simple.

Pour chif­frer on a le choix. On va sépa­rer deux caté­go­ries prin­ci­pales de chif­fre­ment : les chif­fre­ments symé­triques et les asymé­triques.

La plupart des gestion­naires de mots de passe ont choisi un chif­fre­ment symé­trique (une seule clef secrète qui sert à la fois à chif­frer et à déchif­frer). C’est simple à gérer, rapide à l’exé­cu­tion, et il n’y a pas besoin de clef de grande taille. Tous ceux que j’ai vu utilisent de l’AES avec une clef de 256 bits. Au moins pour Bitwar­den et Keepass, c’est le mode CBC, et un contrôle HMAC avec SHA256 comme fonc­tion de hachage (mais vous pouvez igno­rer tous ces détails s’ils ne vous disent rien).

J’ai dit « la plupart des gestion­naires de mots de passe ». Un projet au moins a fait un choix diffé­rent. L’ou­til pass utilise un chif­fre­ment asymé­trique (une clef publique et une clef privée, l’une sert à chif­frer et l’autre à déchif­frer). Plus exac­te­ment, ils utilisent l’ou­til GnuPG. Même si le choix de la clef est libre, par défaut on y utilise géné­ra­le­ment une clef RSA de 2048 bits. Pass a fait ce choix en consi­dé­rant le partage de mots de passes comme la fonc­tion­na­lité prin­ci­pale. On verra pourquoi quand on parlera partage. Entre temps on va se concen­trer sur ceux qui font du chif­fre­ment symé­trique.

Dans les deux cas, on est là dans de l’ul­tra-stan­dard au niveau cryp­to­gra­phie. Je serais étonné de voir autre chose ailleurs (et c’est une bonne chose).

Une clef ? quelle clef ?

Ok, nos mots de passe sont chif­frés mais où est la clef ?

Impos­sible de deman­der à l’uti­li­sa­teur de se rappe­ler une clef de 256 bits. Ce serait plus de 40 signes entre minus­cules, majus­cules, chiffres et carac­tères spéciaux. Même avec une très bonne mémoire, ce serait ingé­rable à l’usage.

Stocker la clef de chif­fre­ment en clair sur le disque n’est pas beau­coup mieux. Ce serait comme avoir coffre-fort haute sécu­rité dont on cache la clef sous le paillas­son.

Ce qu’on demande à l’uti­li­sa­teur c’est un mot de passe prin­ci­pal. Vu qu’il va permettre de déchif­frer tous les autres, on va l’ap­pe­ler « mot de passe maître ». Il faut qu’il soit assez long et complexe pour éviter qu’un tiers ne puisse le devi­ner ou le trou­ver en essayant toutes les combi­nai­sons une à une, mais assez court pour pouvoir s’en rappe­ler et le taper sans erreur.

Le mot de passe maître ne chiffre rien lui-même. Accom­pa­gné d’autres para­mètres, il sert à calcu­ler une clef de taille suffi­sante qui, elle, servira au chif­fre­ment décrit plus haut et qu’on va appe­ler « clef maîtresse ». La fonc­tion qui fait cette opéra­tion est dite fonc­tion de déri­va­tion de clef.

Bitwar­den utilise le très clas­sique PBKDF2 avec un hachage SHA256. Pour faire simple on prend le mot de passe, on le mélange à une chaîne aléa­toire (stockée quelque part pour réuti­li­ser la même à chaque fois), et on opère la fonc­tion de hachage prévue. Norma­le­ment ça suffit pour avoir un résul­tat consi­déré comme rela­ti­ve­ment aléa­toire et impos­sible à remon­ter en sens inverse.

En pratique on cherche aussi à ralen­tir quelqu’un qui cher­che­rait à tester tous les mots de passe possibles un à un. Pour ça on va simple­ment répé­ter l’opé­ra­tion précé­dente un certain nombre de fois. Chaque itéra­tion prend en entrée le résul­tat de l’étape précé­dente. Si je fais 10 itéra­tions, il faudra 10 fois plus de temps à un attaquant pour tester toutes les combi­nai­sons. Ici on consi­dère le résul­tat comme assez confor­table à partir de 100.000 itéra­tions.

Keepass utilise une fonc­tion plus récente et consi­dé­rée comme plus robuste aux possi­bi­li­tés des maté­riels actuels : Argon2.

Là aussi tout est très clas­sique. Je n’ai pas regardé tous les gestion­naires de mots de passe mais je serais étonné de trou­ver autre chose que ces deux solu­tions stan­dards.

On résume

À l’ou­ver­ture le gestion­naire de mots de passe vous demande votre mot de passe maître. À partir de ce mot de passe et de para­mètres prédé­ter­mi­nés, il utilise une fonc­tion de déri­va­tion de clef et en sort une clef maitresse.

C’est cette clef maitresse qui permet de chif­frer ou déchif­frer vos mots de passe. Celui qui n’a pas accès à votre clef ne pourra rien faire des mots de passe chif­frés sur le disque.

Sécu­rité

À l’ou­ver­ture, le gestion­naire de mot de passe vous deman­dera votre mot de passe maître que pour calcu­ler la clef maîtresse à l’aide d’une fonc­tion de déri­va­tion de clef. Une fois ceci fait, il garde la clef maîtresse en mémoire et oublie le reste. Quoi qu’il se passe, personne ne connaî­tra votre mot de passe maître.

Le logi­ciel utilise cette clef maîtresse pour chif­frer et déchif­frer vos mots de passe. Cette clef maîtresse n’est jamais écrite nulle part. La plupart des gestion­naires de mots de passe oublie­ront volon­tai­re­ment cette clef en mémoire après un certain temps d’inac­ti­vité, ou à la mise en veille de votre poste de travail. L’idée c’est de limi­ter le risque de lais­ser qui que ce soit d’autre que vous y avoir accès. Dans ces cas là, on vous invi­tera à saisir de nouveau votre mot de passe maître pour retrou­ver la clef oubliée.

Une fois la clef maîtresse hors de la mémoire, vous n’avez que des blocs chif­frés que personne ne pourra déchif­frer sans le mot de passe maître. Pas même vous. Si vous oubliez votre mot de passe maître, vous ne pour­rez plus jamais relire ce que vous avez stocké. Même votre ami qui s’y connait ne pourra rien pour vous.

Ne vous lais­sez toute­fois par leur­rer. On parle sécu­rité, chif­fre­ment, complexité des fonc­tions de déri­va­tion de clef, mais en réalité tout ça a peu d’im­por­tance comparé à votre mot de passe maître. C’est un peu comme un coffre-fort : Discu­ter du diamètre des barres de renfort n’a aucun inté­rêt s’il s’ouvre avec une combi­nai­son de trois chiffres seule­ment.

S’il est possible de trou­ver votre mot de passe avec un nombre de tenta­tives limité, tout le reste ne servira à rien. « Limité » dans ce cas, ça dépasse la centaine de milliards de combi­nai­sons. Il vaut mieux un mot de passe maître complexe avec une fonc­tion de déri­va­tion simple qu’un mot de passe maître simple avec une fonc­tion de déri­va­tion complexe.

Chan­ger le mot de passe

Les plus alertes d’entre vous auront remarqué que si tout est déchif­fré indi­rec­te­ment à partir du mot de passe, chan­ger le mot de passe fait perdre l’ac­cès à tout ce qui est déjà chif­fré.

Quand vous chan­gez votre mot de passe maître, Keepass déchiffre toutes les données en mémoire, calcule la nouvelle clef et rechiffre l’in­té­gra­lité des données. Même si vous gérez une centaine de mots de passe, c’est quelque chose qui se fait rapi­de­ment sans avoir besoin de vous faire patien­ter long­temps.

Bitwar­den utilise lui une clef inter­mé­diaire tota­le­ment aléa­toire appe­lée clef de chif­fre­ment. C’est cette clef qui sert en réalité à chif­frer et déchif­frer les données stockées. Elle est elle-même chif­frée, à partir de la clef maîtresse, et stockée à côté des données.

On a donc un mot de passe maître qui sert à calcu­ler une clef maîtresse. La clef maîtresse sert à déchif­frer la clef de chif­fre­ment. La clef de chif­fre­ment sert à chif­frer et déchif­frer les données sur le disque.

Lorsqu’on veut chan­ger de mot de passe il suffit de chif­frer la clef de chif­fre­ment avec la nouvelle clef maitresse. Il n’y a pas besoin de rechif­frer chaque donnée (vu que la clef de chif­fre­ment ne change pas, elle).

L’avan­tage n’est pas tant dans le temps gagné (peu signi­fi­ca­tif) mais dans la résis­tance aux accès concur­rents : On peut avoir plusieurs clients qui lisent et écrivent en paral­lèle des données diffé­rentes dans le même trous­seau sans crainte que l’un d’eux n’uti­lise encore une ancienne clef de chif­fre­ment et envoie des données illi­sibles par les autres.

Et juste­ment, et si je partage ?

Avec ce qu’on a vu jusqu’à présent, si je partage des mots de passe je dois aussi parta­ger la clef de chif­fre­ment utili­sée.

Bitwar­den permet de parta­ger des mots de passe à un groupe de plusieurs personnes (appelé « orga­ni­sa­tion »). Au lieu d’être chif­frés avec ma clef de chif­fre­ment person­nelle, ces mots de passe sont chif­frés avec une clef de chif­fre­ment dédiée à l’or­ga­ni­sa­tion.

Le gros enjeu n’est pas dans le chif­fre­ment mais dans comment trans­mettre cette clef d’or­ga­ni­sa­tion à chaque utili­sa­teur de l’or­ga­ni­sa­tion.

Il faut un moyen pour que l’ad­mi­nis­tra­teur de l’or­ga­ni­sa­tion chiffre la clef d’or­ga­ni­sa­tion, me l’en­voie sur le serveur d’une façon que seul moi puisse la relire.

Jusqu’à main­te­nant c’est impos­sible parce que nous utili­sons des clefs symé­triques. C’est la même clef qui sert au chif­fre­ment et au déchif­fre­ment. Si l’ad­mi­nis­tra­teur pouvait chif­frer avec ma clef, il pour­rait aussi déchif­frer tous mes mots de passes person­nels et ça c’est inac­cep­table.

C’est donc ici qu’on reparle des clefs asymé­triques RSA. Chacun a une clef publique (diffu­sée à tout le monde) et une clef privée (garder secrète par chaque utili­sa­teur). La clef publique sert à chif­frer. La clef privée sert à déchif­frer. Tout le monde est donc capable de chif­frer quelque chose avec ma clef publique, mais seul moi pour­rait le déchif­frer.

La clef RSA fait 2048 bits mais ne vous lais­sez pas impres­sion­ner, ces 2048 bits sont en fait moins robustes que les 256 bits d’AES.

L’ad­mi­nis­tra­teur de l’or­ga­ni­sa­tion récu­père ma clef publique, chiffre la clef d’or­ga­ni­sa­tion à l’aide de ma clef publique, et envoie ça sur le serveur. Quand je voudrais chif­frer ou déchif­frer quelque chose dans l’or­ga­ni­sa­tion, je récu­père la clef d’or­ga­ni­sa­tion chif­frée avec ma clef publique, je la déchiffre avec ma clef privée, et je m’en sers dans mes opéra­tions de chif­fre­ment.

Ok, mais il va me falloir sécu­ri­ser ma clef privée. On a déjà les outils pour ça, il suffit de la chif­frer ! Bitwar­den la chiffre donc avec la clef de chif­fre­ment, celle dont on a déjà parlé plus haut.

On a donc un mot de passe maître qui sert à calcu­ler une clef maîtresse. La clef maîtresse sert à déchif­frer la clef de chif­fre­ment. La clef de chif­fre­ment sert à déchif­frer ma clef RSA privée. La clef RSA privée sert à déchif­frer la clef d’or­ga­ni­sa­tion. La clef d’or­ga­ni­sa­tion sert à chif­frer et déchif­frer les données.

Pfiou! Ça semble long et complexe mais tout utilise toujours le même prin­cipe et la plupart de ces opéra­tions ne servent qu’à l’ini­tia­li­sa­tion logi­ciel quand vous le déver­rouillez.

Rappe­lez-vous, votre clef de chif­fre­ment ne change pas quand vous chan­gez votre mot de passe. Pas besoin donc de chan­ger ou rechif­frer vos clefs RSA non plus.

Et Pass alors ?

Pass fait le choix de sauter tout le chif­fre­ment symé­trique et de n’uti­li­ser que l’asy­mé­trique. Un dépôt contient les clefs GPG de tous les membres (clefs publiques). Chaque fois qu’un mot de passe est chif­fré, il l’est avec toutes ces clefs. Quand un membre veut lire un des mots de passe, il le déchiffre avec sa propre clef privée.

Quand on ajoute un membre, quand on change une clef, il faut tout rechif­frer.

Rejoindre la conversation

6 commentaires

  1. Salut,
    Ton article est TRÈS intéressant et tout est bien expliqué. Je ne suis pas un expert et je ne saurai dire si techniquement tout est correct, mais le mot clé ne s’écrit pas clef.
    Ca sera ma maigre contribution ^^

    Merci pour ton article.

    1. Merci

      Pour « mot clef » et « mot clé » les deux graphies sont correctes. J’ai confirmer ça sur le CNRTL. Le LFi propose « mot clé » en référence. L’Académie française propose « mot clef » en référence. Les deux sources acceptent les deux graphies.

      J’avoue que j’ai l’habitude d’utiliser « clef », un peu charme d’antan peu être

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

À propos de ce site, du contenu, de l'auteur
Je poste parfois ici des humeurs ou des pensées. Parfois je change, parfois je me trompe, parfois j'apprends, et souvent le contexte lui-même évolue avec le temps. Les contenus ne sont représentatifs que de l'instant où ils ont été écrits. J'efface peu les contenus de ce site, merci de prendre du recul quand les textes sont anciens. Merci

À toutes fins utiles, ce site est hébergé par Scaleway, ONLINE SAS, joignable par téléphone au +33 (0)1 84 13 00 00 et joignable par courrier à l'adresse BP 438 - 75366 Paris Cedex 08.