Catégorie : Technique

  • Vie privée : Chif­fre­ment des disques

    On parle tant des mots de passe qu’on en oublie l’es­sen­tiel.

    Quiconque a accès à votre disque dur a accès à toute votre vie numé­rique, vos logi­ciels et vos docu­ments.

    Il peut relire votre l’at­tes­ta­tion de sécu télé­char­gée le mois dernier, votre feuille de calcul avec votre compta, vos photos de vacances mais aussi celles que vous gardez privées, la lettre à mamie, le testa­ment de grand père, votre carnet d’adresse complet.

    Il a accès aussi à votre histo­rique de navi­ga­tion inter­net des 30 ou 90 derniers jours, votre compte face­book, votre compte email avec l’in­té­gra­lité de vos échanges passés.

    Si vous êtes enre­gis­tré sous Google et que vous avez un Android, il y a toutes les chances qu’il puisse accé­dez à tout l’his­to­rique de géolo­ca­li­sa­tion et retra­cer dans le détail tous vos dépla­ce­ments depuis plusieurs mois.

    Via le navi­ga­teur il a aussi accès à tous les sites sur lesquels vous êtes enre­gis­tré, ceux pour lesquels vous avez enre­gis­tré le mot de passe. Vu qu’il a accès à vos emails, il pourra de toutes façons réini­tia­li­ser les mots de passe qu’il lui manque.

    Si on parle de votre télé­phone, ça inclut aussi tous vos SMS, votre histo­rique d’ap­pel, vos conver­sa­tions snap­chat, what­sapp et autres outils de commu­ni­ca­tion.

    Ça fait peur, non ?

    Ça arri­vera si quelqu’un de malveillant vous en veut person­nel­le­ment, mais aussi vous êtes la cible aléa­toire d’un cambrio­lage, que ce soit par le cambrio­leur ou par la personne chez qui se retrouve avec votre disque une fois remis en circu­la­tion.

    Non, il n’y a pas besoin de votre mot de passe de session windows ou mac pour cela. Il suffit d’ac­cé­der au disque direc­te­ment. Tout est dessus, en clair.

    Ok, comment on chiffre le disque alors ?

    Sous Windows ça s’ap­pelle BitLo­cker. Sous Mac ça s’ap­pelle FileVault. Sous Android ça s’ap­pelle simple­ment « Chif­frer l’ap­pa­reil » ou « Chif­frez vos données » quand ce n’est pas activé par défaut, et vous avez en plus un « Cryp­tage de la carte SD » pour la carte SD si vous en avez ajouté une.

    Vous trou­ve­rez ça à chaque fois dans la section « sécu­rité » des préfé­rences de votre système.

    La procé­dure est norma­le­ment assez simple (windows, mac). Assu­rez-vous simple­ment de ne pas oublier votre mot de passe.

    Voilà, c’est fait. Toutes vos données sont chif­frées, illi­sibles par un tiers.

    Bien entendu ça ne fonc­tionne que si vous avez aussi activé un déver­rouillage manuel obli­ga­toire au réveil de votre PC et de votre télé­phone, et que vous n’avez pas laissé le mot de passe sur un post-it juste à côté. Il ne sert à rien d’avoir une porte qui ferme à clef si vous lais­sez la clef sous le paillas­son ou si vous la lais­sez toujours ouverte.

    C’est quoi le piège ?

    Désor­mais votre cambrio­leur ne peut pas accé­der à vos données sans le mot de passe. Votre voisin ne peut pas accé­der à vos données sans le mot de passe.

    Vous non plus… Le piège est là. Sans le mot de passe vos données sont perdues, même pour vous.

    Apple vous propose de rete­nir une clef chez lui et de la sécu­ri­ser avec votre compte Apple. Je crois que Micro­soft fait pareil. Sur Android à ma connais­sance il n’y a rien de tout cela.

    En réalité ça n’est qu’un (mauvais) filet de sécu­rité.

    1/ N’ou­bliez pas le mot de passe.

    2/ Faites de sauve­gardes (même si vous avez le mot de passe, le disque lui-même peut casser, et au pire vous pour­rez récu­pé­rer vos données sur la sauve­garde)

    3/ Donnez un moyen à vos proches d’ac­cé­der aux données qui les concernent (photos de famille par exemple) si jamais il vous arrive quelque chose.

  • Self Encryp­ting Disk

    Ce soir j’ai joué avec les SED sous Linux. Ce fut labo­rieux et la docu­men­ta­tion est assez rare alors je pose ça ici si jamais ça sert à quelqu’un d’autre.

    Chif­frer ses données

    Sur mon NAS j’ai des données que je ne veux pas perdre, mais aussi des données que je ne veux pas voir fuiter n’im­porte où en cas de cambrio­lage.

    Jusqu’à présent j’avais une parti­tion prin­ci­pale en clair pour le système d’ex­ploi­ta­tion, et une parti­tion chif­frée via LUKS pour les données.

    Avan­tage : Ça fonc­tionne et je peux monter ma parti­tion à distance pour peu que le NAS ait redé­marré suite à un inci­dent élec­trique.

    Désa­van­tage : Parfois le système démarre mais n’a pas ses données. Il faut que je pense à redé­mar­rer certains services (oui, ça aurait pu être ajouté dans un script, je ne l’ai simple­ment pas fait).

    J’ai aussi la désa­gréable impres­sion que les copies se trainent comme il y a 20 ans alors que le disque est rapide. Il faut dire que j’ai un ancien Cele­ron J très faiblard et on a beau me dire que le chif­fre­ment ne consomme quasi­ment rien, mes explo­ra­tions me laissent penser le contraire.

    Les SED

    Les SED sont les self encryp­ting drives. Quasi­ment tous les SSD modernes sont des SED OPAL.

    Le firm­ware d’un SED sait chif­frer et déchif­fer toutes les données à la volée. Il suffit d’ini­tia­li­ser le disque à l’aide d’une pass-phrase. Lui va aller déchif­frer une clef AES 256 bits à l’aide de cette pass-phrase, et ensuite l’uti­li­ser pour chif­frer ou déchif­frer toutes les entrées sorties.

    C’est tota­le­ment trans­pa­rent pour l’OS et ça ne consomme aucun CPU. C’est même telle­ment trans­pa­rent qu’il le fait même si vous ne lui deman­dez pas. « Chif­fre­ment désac­tivé » revient en fait à chif­frer et déchif­frer avec une clef AES stockée en clair, mais on chiffre et déchiffre quand même toutes les données qui tran­sitent (gros avan­tage : On peut acti­ver le chif­fre­ment à la volée quand on le souhaite sans avoir à toucher les données : Il suffit de chif­frer la clef AES qui était aupa­ra­vant en clair).

    Pour chif­frer le disque d’amorçage il y a une astuce. Le disque a en fait une zone d’amorçage cachée où on charge une image dite PBA (pre-boot autho­ri­za­tion). Quand le disque est verrouillé, c’est cette zone qui est vue par la machine et qui est donc amor­cée. L’image demande la pass-phrase, initia­lise la clef AES, désac­tive la fausse zone d’amorçage et relance la machine comme si de rien n’était. Là aussi c’est tota­le­ment trans­pa­rent, l’OS n’y voit que du feu et a l’im­pres­sion de travailler avec un disque stan­dard, amorçage inclus.

    Sécu­rité

    Les SED ont très mauvaise répu­ta­tion depuis qu’une étude de sécu­rité a trouvé que de nombreux construc­teurs ont implé­menté tout ça avec les pieds (genre : la clef AES n’est pas chif­frée et en mani­pu­lant un peu le firm­ware on peut y avoir accès).

    Certains en tirent « il ne faut pas se repo­ser sur les SED » mais c’est un peu plus complexe que ça. Le stan­dard OPAL 2 est tout à fait solide d’un point de vue théo­rique. Il fonc­tionne d’ailleurs de manière très simi­laire à ce que fait LUKS sous Linux. Il faut juste que ce soit implé­menté avec sérieux.

    Il se trouve que, juste­ment, la même étude dit que les Samsung EVO récents ont une implé­men­ta­tion sérieuse. C’est ce que j’ai choisi, ça me va tout à fait.

    Il reste des attaques possibles, mais rien lié à mon modèle de menace (un simple cambrio­lage par des gens venus piquer le maté­riel infor­ma­tique pour le revendre). La NSA, elle, trou­vera de toutes façons moyen d’ac­cé­der à mes données que j’uti­lise LUKS ou un SED.

    Confi­gu­rer un SED

    Je n’ai trouvé que deux docu­men­ta­tions utiles, celle de ArchLi­nux et celle de l’uti­li­taire sedu­tils. On part d’une instal­la­tion OS exis­tante, on peut acti­ver le chif­fre­ment après coup.

    Acti­ver libata.allow_tpm

    Première étape, pour jouer il faudra acti­ver libata.allow_tpm. Sur Debian la seule manière qui m’a semblé fonc­tion­nelle est d’édi­ter /etc/default/grub et d’ajou­ter « libata.allow_tpm=1 » à la variable d’en­vi­ron­ne­ment GRUB_CMDLINE_LINUX_DEFAULT puis exécu­ter update-grub2 et relan­cer la machine.

    Instal­ler sedu­tils

    Je n’ai pas trouvé de paquet Debian. J’ai télé­chargé la distri­bu­tion binaire Linux à partir du site offi­ciel et ai copié sedu­tils-cli dans /usr/local/sbin. Vous aurez besoin qu’il soit dans le PATH plus tard.

    Prépa­rer une image PBA

    Les docu­men­ta­tions proposent de récu­pé­rer une image offi­cielle. Chez moi ça n’a pas fonc­tionné. Le disque est bien déver­rouillé mais ensuite la machine ne savait plus iden­ti­fier l’UEFI du disque pour lancer Linux.

    J’ai du créer ma propre image. C’est de toutes façons ce que je vous recom­mande parce que les images offi­cielles ne gèrent que les claviers US.

    Après avoir installé les paquets binu­tils, net-tools et console-data, télé­char­ger le projet rear puis suivre ce commen­taire :

    sudo apt install -y binutils net-tools console-data
    
    # aller à la racine du projet
    cd rear 
    echo "OUTPUT=RAWDISK" > ./etc/rear/site.conf
    sudo ./usr/sbin/rear -v mkopalpba
    # l'image est dans ./var/lib/rear/TCG-OPAL-PBA/*/*.raw
    Prépa­rer une clef USB de récu­pé­ra­tion

    Je suis comme tout le monde, j’avais sauté cette étape initia­le­ment mais elle vous sera indis­pen­sable pour retrou­ver l’uti­li­taire sedu­tils et pouvoir réini­tia­li­ser le disque en cas de problème (l’image d’ins­tal­la­tion de Debian non seule­ment n’a pas sedu­tils mais ne lance de toutes façons pas son kernel avec libata.allow_tpm, donc vous ne pour­rez rien en faire).

    Là vous pouvez prendre l’image rescue 64 bits offi­cielle et initia­li­ser une petite clef USB au cas où.

    gunzip RESCUE64.img.gz
    # /dev/sdb est ma clef USB
    dd if=RESCUE64.img.gz of=/dev/sdb

    En cas de diffi­culté ça permet de désac­ti­ver le chif­fre­ment, voire de réini­tia­li­ser un nouveau mot de passe si rien d’autre ne fonc­tionne (si la désac­ti­va­tion se fait sans perte de données, la réini­tia­li­sa­tion vous fait repar­tir avec un disque tota­le­ment vierge).

    # Désactiver le chiffrement
    # Remplacer passphrase par votre passphrase et /dev/sda par votre disque
    sudo sedutil-cli --disableLockingRange 0 passphrase /dev/sda
    sedutil-cli --setMBREnable off passphrase /dev/sda
    Confi­gu­rer le disque

    Désor­mais on peut suivre la procé­dure stan­dard, en utili­sant l’image PBA obte­nue plus haut :

    # Confirmer que le disque est utilisable
    sudo sedutil-cli --scan
    # Remplacer passphrase par votre passphrase et /dev/sda par votre disque
    sudo sedutil-cli --initialsetup passphrase /dev/sda
    sudo sedutil-cli --loadPBAimage passphrase imagePBA.raw /dev/sda
    sudo sedutil-cli --setMBREnable on passphrase /dev/sda
    sudo sedutil-cli --enableLockingRange 0 passphrase /dev/sda

    Éteindre et rallu­mer la machine (pas juste redé­mar­rer) devrait suffire à vous deman­der la pass­phrase. Une fois celle-ci saisie, la machine redé­marre encore. Oui c’est long mais c’est normal.

    Chez moi on me demande deux fois la pass­phrase et j’ai donc deux reboot au lieu d’un seul. C’est très long, agaçant. Si quelqu’un voit quel peut être le problème, ça m’in­té­resse. Entre temps je fais avec : Je ne devrais pas redé­mar­rer tous les quatre matins.

  • Sécu­ri­ser les nouveaux mots de passe

    J’ai récem­ment parlé complexité de mot de passe mais en réalité le problème est souvent ailleurs. La taille et la complexité n’ont aucune impor­tance si quelqu’un peut devi­ner quel mot de passe vous utili­sez après juste quelques essais.

    Jean réuti­lise son mot de passe

    Je connais l’email de Jean ? Il me suffit de regar­der quels mots de passe il a utilisé sur d’autres sites, et de les tester un à un.

    La plupart des sites ont un problème de sécu­rité un jour ou l’autre. Souvent les données extraites se retrouvent publiques d’une façon ou d’une autre. Parfois on y trouve des mots de passe en clair ou mal proté­gés. Il suffit de piocher dedans.

    Testez Have I Been Pwned, vous verrez que des tiers peuvent déjà connaitre plusieurs de vos mots de passe.

    Paul n’a aucune imagi­na­tion

    Je ne connais pas l’email de Paul ? Qu’im­porte. Je peux déjà tester les mots de passe les plus courants, et les varia­tions de ceux-ci.

    Ne vous croyez pas origi­nal. Même ajou­ter une date, un chiffre, un symbole, chan­ger une lettre, inver­ser le mot de passe, quelqu’un l’a déjà fait. En quelques milliers de combi­nai­sons j’ai déjà énor­mé­ment de mots de passe habi­tuels.

    Même les méthodes « choi­sir x mots du diction­naire » sont vulné­rables si c’est l’uti­li­sa­teur qui choi­sit ses mots dans sa tête. Le plus souvent on tombera dans quelques centaines de mots, toujours les mêmes.

    Par le passé j’ai utilisé un person­nage de litté­ra­ture, auquel j’ai ajouté un chiffre et un symbole. Croyez-le ou non, on trouve plus d’une dizaine d’oc­cur­rences sur Have I Been Pwned.

    Have I Been Pwned

    J’ai cité Have I Been Pwned. Ils mettent à dispo­si­tion une base de tous les mots de passe qui ont publique­ment fuité.

    Si vous lais­sez des tiers saisir des mots de passe sur votre service, vous devriez télé­char­ger leur base, puis cher­cher dedans à chaque fois qu’un de vos utili­sa­teur saisit un nouveau mot de passe. Le mot de passe est déjà dedans ?

    Alors il y a un risque de sécu­rité et vous devriez en aler­ter l’uti­li­sa­teur.

    Si vous voulez aller plus loin, tentez quelques varia­tions simples : Si le mot de passe se termine par un nombre, essayez les deux ou trois nombres précé­dents. Si le mot de passe à des symboles ou chiffres en début ou fin, reti­re­rez-les et testez le mot de passe résul­tant.

    Tout ça ne vous coûte quasi­ment rien si ce n’est un peu de stockage et le télé­char­ge­ment de la nouvelle base Have I Been Pwned de temps en temps, mais ça va éviter bien des risques à vos utili­sa­teurs.

  • Éthique et poli­tique dans les licences logi­cielles

    Je conti­nue mes réflexions sur comment nous, infor­ma­ti­ciens, parti­ci­pons à la poli­tique par nos actions.

    Il ne tient qu’à nous de refu­ser de parti­ci­per à des projets et des orga­ni­sa­tions du mauvais côté de la ligne morale. Contrai­re­ment à d’autres profes­sions, nous avons le choix. Utili­sons-le.


    Plus que le choix, nous avons un pouvoir, énorme. C’est un des appren­tis­sages des logi­ciels libres. Nous avons quand même réussi que les plus grandes corpo­ra­tions se sentent obli­gées de contri­buer, même de façon mineure, à des logi­ciels communs profi­tant à tous. Nous avons réussi à en faire un argu­ment dans les proces­sus de recru­te­ment.

    Imagi­nez, le temple du capi­ta­lisme, les méga star­tup techno qui contrôlent jusque notre vie privée, obli­gées de fait de se plier à contri­buer au domaine commun. Quel pouvoir !


    Nous avons utilisé ce pouvoir pour impo­ser le libre accès au logi­ciel et au code source, en nous moquant de qui l’uti­lise et pour faire quoi, comme si cela ne nous concer­nait pas.

    Que nous importe que l’im­pri­mante gère des listes de personnes à abattre tant que nous avons accès au code source du pilote pour en corri­ger les défauts. Je ne peux m’exo­né­rer des consé­quences de ce que je créé et de ce que je diffuse.

    Avec tout le respect que j’ai pour l’énorme œuvre du logi­ciel libre, j’ai l’im­pres­sion que nous avons partiel­le­ment fait fausse route, privi­lé­giant une vision liber­taire amorale plutôt qu’as­su­mer les consé­quences de ce que nous créons.

    Pire, en faisant le logi­ciel libre comme l’al­pha et l’oméga de toute notion poli­tique et éthique dans le logi­ciel, nous nous sommes reti­rés toute capa­cité à inter­ve­nir sur d’autre critères.


    Je repense à la licence JSON qui avait fait grand bruit par le passé.

    The Soft­ware shall be used for Good, not Evil.

    https://www.json.org/license.html

    Cette notion m’at­tire, aussi floue et aussi problé­ma­tique soit-elle.

    Oui, cette licence n’est pas libre. La licence GPL serait incom­pa­tible avec icelle. Qu’im­porte : L’ac­cès au logi­ciel et à son code source ne me semble pas une valeur si abso­lue qu’il me faille aban­don­ner tout recul sur ce qui est fait avec le logi­ciel.

    Je ne suis pas seul, en paral­lèle d’autres ont mis à jour la licence Hippo­cra­tic, qui va globa­le­ment dans le même sens.

    The soft­ware may not be used by indi­vi­duals, corpo­ra­tions, govern­ments, or other groups for systems or acti­vi­ties that acti­vely and knowin­gly endan­ger, harm, or other­wise threa­ten the physi­cal, mental, econo­mic, or gene­ral well-being of indi­vi­duals or groups in viola­tion of the United Nations Univer­sal Decla­ra­tion of Human Rights

    https://first­do­no­harm.dev/version/1/1/license.html

    J’ajou­te­rais proba­ble­ment la conven­tion de Genève, celle des droits de l’en­fant, peut-être un texte de portée simi­laire parlant d’éco­lo­gie (lequel ?), un lié à la vie privée, etc.

    Ça reste flou mais ça permet de tout de même donner un cadre, surtout si on ajoute que l’in­ter­pré­ta­tion à donner à ces textes ne doit pas être moins stricte que celle de l’Eu­rope occi­den­tale de notre décen­nie.

    Peu importe en réalité. Il s’agit de donner une inten­tion. Je n’ai pas cette préten­tion mais si l’ar­mée ou une corpo­ra­tion sans éthique veut réuti­li­ser mon code, ce n’est pas la licence qui les en empê­chera, flou ou pas.

    Je ne prétends certai­ne­ment pas aller devant au tribu­nal. Ma seule arme est l’op­probre publique et le flou n’est ici pas un problème. La préci­sion juri­dique n’est pas un besoin. Au contraire, rester au niveau de l’in­ten­tion permet d’évi­ter les pirouettes en jouant sur les mots ou en trou­vant les failles. Quelque part la formu­la­tion de la licence JSON a ma préfé­rence, juste­ment pour ça.

    Ça vous parait fou, irréa­liste, inap­pli­cable, mais combien d’entre nous auraient trou­vés la GPL raison­nable, réaliste et appli­cable à ses débuts ? Les débats n’ont d’ailleurs pas manqué.


    Le seul vrai problème, à mon niveau, est bien celui du logi­ciel libre, et plus parti­cu­liè­re­ment de la GPL, incom­pa­tible avec toute autre licence qui fait des choix diffé­rents. Or la GPL est incon­tour­nable dans de nombreuses situa­tions, dans de nombreux contextes.

    Une solu­tion pour­rait être de propo­ser une double licence : une licence basée sur l’éthique, tout en prévoyant une excep­tion qui permet de passer sur une AGPL au besoin.

  • Déve­lop­peurs, vous devriez avoir honte — Règles de mots de passe

    Je rage à chaque fois que je saisis un mot de passe fort et que le site m’en­voie bouler parce que je n’ai pas de carac­tère autre qu’al­pha­nu­mé­rique.

    Essayons quelque chose d’un peu plus smart pour évaluer la robus­tesse d’un mot de passe

    Déve­lop­peurs, vous savez proba­ble­ment tout ça, mais conti­nuez à lire parce que la fin vous est adres­sée

    Si j’en crois Hacker­noon on peut calcu­ler envi­ron 800 millions de SHA256 par seconde sur un maté­riel qui coûte 0,82 € par heure sur AWS. Ça fait 3,5 10^12 combi­nai­sons par euro.

    Traduit autre­ment, voici le nombre de combi­nai­sons qu’on peut tester, et le même chiffre écrit en puis­sance de deux (arrondi à la déci­male infé­rieure) :

    1 €3,5 × 10^122^41,6
    10 €3,5 × 10^132^44,9
    100 €3,5 × 10^142^48,3
    1 000 €3,5 × 10^152^51,6
    10 000 €3,5 × 10^162^54,9
    100 000 €3,5 × 10^172^58,2

    Quand on vous parle ailleurs de bits d’en­tro­pie, ça corres­pond à ces puis­sances de 2. Avec 1 000 € on peut tester toutes les combi­nai­sons de SHA 256 d’une chaîne aléa­toire de 51 bits.

    Ok, mais ça me dit quoi ? Une lettre c’est 26 combi­nai­sons, envi­ron 4,7 bits. Si vous ajou­tez les majus­cules vous doublez le nombre de combi­nai­sons et vous ajou­tez 1 bit. Si vous ajou­tez les chiffres et quelques carac­tères spéciaux on arrive à à peine plus de 6 bits.

    Petit calcul, en utili­sant juste les 26 lettres de l’al­pha­bet, on peut tester toutes les combi­nai­sons de 8 carac­tères pour moins de 1 €. Vu qu’on aura de bonnes chances de tomber dessus avant d’avoir testé toutes les combi­nai­sons, autant dire que même avec 9 carac­tères, votre mot de passe ne vaut pas plus de 1 €.

    Combien faut-il de carac­tères pour se trou­ver rela­ti­ve­ment à l’abri (c’est à dire que la somme inves­tie ne peut pas tester plus de 1% des combi­nai­sons) ? Ça va dépendre de ce que vous y mettez comme types de carac­tères. J’ai fait les calculs pour vous :

    a-za-z
    A-Z
    a-z
    A-Z
    0–9
    a-z
    A-Z
    0–9
    +-%
    1 €11998
    10 €111099
    100 €12101010
    1 000 €13111010
    10 000 €14111111
    100 000 €14121111

    Et là magie : 8 carac­tères, même avec des chiffres, des majus­cules et des symboles, ça résiste tout juste à 1 €. Et encore, là c’est en partant du prin­cipe que vous choi­sis­sez réel­le­ment les carac­tères de façon aléa­toire, pas que vous ajou­tez juste un symbole à la fin ou que vous trans­for­mez un E en 3.

    Vous voulez que votre mot de passe résiste à un voisin malveillant prêt à mettre plus de 10 € sur la table ? Prévoyez au moins 10 carac­tères.

    Et là, seconde magie : Si vous mettez 10 carac­tères on se moque de savoir si vous y avez mis des chiffres ou symboles. La longueur a bien plus d’im­por­tance que l’éven­tail de carac­tères utilisé.


    Main­te­nant que vous savez ça, tous les sites qui vous imposent au moins une majus­cule et un symbole mais qui vous laissent ne mettre que 8 carac­tères : Poubelle.

    Je ne suis pas en train de vous apprendre à faire un mot de passe fort. Vous devriez utili­ser un gestion­naire de mots de passe et le géné­ra­teur auto­ma­tique qui y est inclus.

    Je suis en train d’es­sayer de rendre honteux tous les déve­lop­peurs qui acceptent de mettre ces règles à la con sur les sites web dont ils ont la charge : Vous impo­sez des mots de passe qui sont à la fois imbi­tables et peu robustes.


    Vous voulez faire mieux ?

    Regar­dez dans quelle colonne est l’uti­li­sa­teur en fonc­tion des carac­tères qu’il a déjà tapé et donnez-lui un indi­ca­teur en fonc­tion de la longueur de son mot de passe.

    • Mot de passe refusé s’il est sur « Have I Been Pwned? »
    • Moins de 10 € ? mot de passe insuf­fi­sant, refusé
    • Moins de 100 € ? mot de passe faible, couleur rouge
    • Moins de 1 000 € ? mot de passe moyen, couleur orange
    • Mot de passe sûr, couleur verte, à partir de 10 000 €

    Si vous gérez un site central, par exemple un réseau social public, vous pouvez proba­ble­ment rele­ver tout ça d’un cran.

    Si ça donne accès à des données sensibles, à des possi­bi­li­tés d’achat, à la boite e-mail ou à l’opé­ra­teur télé­pho­nique, mieux vaux rele­ver tout ça de deux crans.

    Le tout prend proba­ble­ment moins de 10 lignes en javas­cript. C’est une honte que vous accep­tiez encore d’im­plé­men­ter des règles à la con « au moins une majus­cule, un chiffre et un symbole, voici les symboles auto­ri­sés […] ».

    Déve­lop­peurs, vous devriez avoir honte.

  • 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.

  • [code] Liste des imports

    J’au­rais évité autant que possible il y a 15 ans, aujourd’­hui je suis amou­reux des import expli­cites en début de fichier, sans aucun symbole externe qui ne soit importé expli­ci­te­ment. Pas de symbole chargé ou défini dans un autre fichier magique­ment acces­sible ailleurs, pas même d’import *. Si je m’écou­tais en ce moment je voudrais même impor­ter les types de base du langage.

    Mon histo­rique PHP et Ruby m’ont long­temps fait voir l’ab­sence de tout ça comme un avan­tage. Ça n’est vrai qu’a­vec de très bon IDE. En pratique ça ne permet pas de savoir où est défini le symbole, s’il existe vrai­ment, ni de gérer correc­te­ment les conflits de noms et surcharges locales.

    Il y a souvent telle­ment peu de modules, classes et fonc­tions externes diffé­rentes dans un fichier bien struc­turé que l’ex­pli­cite apporte bien plus de béné­fices que de péni­bi­lité. Si on dépasse la dizaine c’est le symp­tôme que quelque chose ne va pas par ailleurs


    Côté syntaxe j’ap­pré­cie celle de Python qui montre ce qui est impor­tant systé­ma­tique­ment en fin de ligne.

    from xxx import A, B, C as D

    Les imports Javas­cript sont pratiques mais la partie la plus signi­fi­ca­tive se retrouve en milieu de ligne, pas toujours là où c’est visuel­le­ment le plus iden­ti­fiable (sans comp­ter la dualité entre import A et import { A })


    Soyons fous, on pour­rait même impor­ter les objets de base du langage avec un import { String, Integer, Array } from StdLib. On n’en utilise pas plus d’une poignée dans un même fichier. Point bonus si ça permet que "hello", 42, ou [1, 2, 3] soient des raccour­cis de syntaxe vers les classes ainsi décla­rées en haut de fichier et n’uti­lisent pas forcé­ment les classes natives du langage.

    import { String, Integer } from Stdlib
    import { MyArray as Array } from MaLibPerso
    import { MACONSTANTE, MaClasse } from MonAutreLibPerso

    Quitte à faire une liste de course, pour­rait-on faire que les imports avec un chemin absolu « /dir/sub/fichier » réfé­rencent la racine du projet et pas la racine du système de fichier ?

  • Où je dis du bien du CSS-in-JS

    Il n’y a que les imbé­ciles qui ne changent pas d’avis et c’est mon avis depuis toujours

    Coluche

    J’ai toujours regardé avec dédain les tenta­tives des dev JS pour contour­ner l’écri­ture de CSS mais je commence à consi­dé­rer que les outils de CSS-in-JS type Emotion sont la bonne solu­tion pour les webapp React.


    J’ai été inté­gra­teur, à faire de la belle CSS sépa­rée du code HTML. On finit quand même vite par construire des monstres ou se prendre les pieds dans le tapis dès qu’on fait plus de quelques pages types.

    Pour résoudre le problème, élimi­nons le. C’est ce que proposent les conven­tions comme BEM. Si je cari­ca­ture, il s’agit prin­ci­pa­le­ment de reti­rer les sélec­teurs CSS un attri­buant une ou plusieurs classes spéci­fiques à chaque contexte. C’est fran­che­ment moche mais ça fonc­tionne.

    CSS-Modules va un peu plus loin. Le prin­cipe est le même mais on permet au déve­lop­peur d’uti­li­ser un nommage plus agréable. C’est l’ou­til de géné­ra­tion qui gère la complexité au lieu du déve­lop­peur.


    J’avoue que j’aime bien CSS-modules. C’était mon favori jusqu’à présent.

    Ça revient à juste gérer un fichier par compo­sant en se limi­tant à des sélec­teurs très simples pour ne pas créer de conflits de spéci­fi­cité. On reste sur du CSS stan­dard et sur une approche proche de mes habi­tudes histo­riques. Mieux : L’in­té­gra­tion peut se faire indé­pen­dam­ment du langage de déve­lop­pe­ment de l’ap­pli­ca­tif.

    C’est top mais ça se base sur des compo­sants qui ne bougent pas beau­coup, dont on connait à l’avance tous les états.

    Dès qu’il s’agit de cumu­ler plusieurs états, le résul­tat dépend de l’ordre d’écri­ture dans la CSS. Parfois c’est bien prévu, parfois non.

    Dès qu’il s’agit de rendre des choses très dyna­miques, il faut de toutes façons sortir des CSS modules. Vous voulez que dans la vue large les items de navi­ga­tion se colorent au survol en fonc­tion de la caté­go­rie desti­na­tion déter­mi­née dyna­mique­ment mais qu’ils utilisent la couleur neutre dans la vue réduite desti­née aux mobiles ? Vous êtes à poil et il va falloir compo­ser avec d’autres façons d’injec­ter des CSS, peut-être même tâton­ner sur les prio­ri­tés entre classes.


    Les classes utili­taires et CSS atomiques à la Tachyon sont là pour indus­tria­li­ser en pous­sant encore plus loin.

    J’ai une classe par valeur à appliquer : .ms7-ns applique la septième valeur du cata­logue (7) comme taille hori­zon­tale maxi­mum (ms pour max-width) si la fenêtre a une taille supé­rieure au point de rupture « small » (ns pour non-small).

    Ça n’offre quasi­ment aucune abstrac­tion utile (unifor­mi­ser les valeurs on a déjà plein d’ou­tils plus effi­caces). C’est vite cryp­tique, lourd, et mons­trueux dès qu’on multi­plie les valeurs et les points de rupture possibles.

    Le seul inté­rêt par rapport à écrire direc­te­ment les attri­buts style c’est que ça permet d’ac­cé­der aux media query et aux pseudo-sélec­teurs.

    Malheu­reu­se­ment non seule­ment ça ne résout pas les conflits de prio­ri­tés mais ça les empire. Si je spécia­lise un compo­sant exis­tant en y ajou­tant une classe liée à une direc­tive déjà présente, je joue à la roulette russe. Il faut abso­lu­ment que mon compo­sant initial prévoit lui-même tous les cas possibles pour savoir quelle classe injec­ter et ou ne pas injec­ter. Pas d’al­ter­na­tive.

    J’ai vrai­ment l’im­pres­sion d’un retour en arrière mons­trueux avec ces CSS atomiques, cumu­ler les défauts sans aucun avan­tage, et c’est proba­ble­ment ce qui m’a fait reje­ter par prin­cipe les CSS-in-JS jusqu’a­lors.


    Les CSS-in-JS c’est fina­le­ment pous­ser la logique de Tachyons un cran plus loin. Quitte à déci­der de tout dans le code HTML, autant écrire direc­te­ment les styles à cet endroit là en utili­sant la vraie syntaxe CSS et en y ajou­tant la possi­bi­lité d’ac­cé­der aux media query et aux pseudo-sélec­teurs.

    Emotion c’est ça. On est à la croi­sée entre le « j’écris tout dans un attri­but style » et le « j’at­tache un module CSS ».

    En fonc­tion­ne­ment basique c’est comme un CSS module sans le sélec­teur. Je donne les direc­tives en CSS on ne peut plus clas­siques et j’ai accès aux media query, aux pseudo-sélec­teurs et aux anima­tions avec une syntaxe proche de ce que font les prépro­ces­seurs habi­tuels (et en phase avec la direc­tion que prend la syntaxe CSS elle-même).

    const style = css`
    padding: 32px;
    background-color: hotpink;
    font-size: 24px;
    border-radius: 4px;
    &:hover {
    color: blue;
    }
    `

    Je peux direc­te­ment ajou­ter le résul­tat aux classes CSS de mon compo­sant. Il se char­gera de géné­rer un nom de classe, de créer la CSS corres­pon­dante dans le docu­ment, et de lier les deux, comme avec CSS-Modules.

    L’exemple est peu parlant. On a juste l’im­pres­sion d’un CSS-Modules écrit dans le fichier JS.

    L’avan­tage c’est que je ne suis pas limité aux valeurs en dur. Je peux avoir des valeurs dyna­miques venant de mon Javas­cript ou de mon thème, et je n’en limite pas les effets à ce que me permettent les variables CSS.

    Je peux aussi réuti­li­ser, compo­ser ou surchar­ger un élément ou un bloc de styles avec un autre sans risque de conflit de prio­rité.


    Tachyons me donnait l’im­pres­sion de cumu­ler les incon­vé­nients, ici j’ai vrai­ment l’im­pres­sion de cumu­ler les avan­tages.

    La seule contrainte c’est que mon code CSS se retrouve dans mes fichiers JS. C’est moche quand c’est dit ainsi mais pour une app en React, on a de toutes façons un fichier par compo­sant HTML et ça a du sens de grou­per HTML, JS et CSS lié au compo­sant ensemble quand ils sont forte­ment liés. C’est d’ailleurs le choix de VueJS.

    Ce n’est forcé­ment pas adapté à tout, et si vous voulez rester géné­riques les CSS-Modules sont à mon avis l’op­tion la plus saine, mais pour un code React je crois que c’est là que je commen­ce­rai par défaut désor­mais.

  • Les petits plus : gitup

    J’ai toujours été gêné par l’in­té­gra­tion de grosses modi­fi­ca­tions dans git.

    Dans l’idéal on fait une série de modi­fi­ca­tions auto­nomes, on les soumet à la revue des pairs puis on les intègre dans les branche prin­ci­pale qui peut partir en produc­tion à tout moment.

    Ça c’est la théo­rie. En pratique je fais des erreurs que je ne vois qu’à la fin des modi­fi­ca­tions. Mes collègues auront de toutes façons des retours sur ce que j’ai poussé en ligne et me deman­de­ront des modi­fi­ca­tions avant l’in­té­gra­tion finale. Si ce n’est pas le cas au moins une fois sur deux, c’est que nous travaillons mal.

    Et là… les ennuis commencent.

    Mes modi­fi­ca­tions ne sont plus auto­nomes. J’ai des correc­tifs à la fin. Poten­tiel­le­ment mes modi­fi­ca­tions précé­dentes sont donc incom­plètes, de mauvaise qualité ou même défaillantes. Si j’in­tègre mon code à la fin de la revue, je casse toute la belle théo­rie.

    J’ai vu deux pratiques suivant les équipes :

    La première pratique c’est d’in­té­grer le code tel quel sur la branche master. C’est ce qui m’ap­pa­rait le plus cohé­rent. Le code de la branche est poten­tiel­le­ment instable mais tous les points d’étape de master sont de qualité. Pour parcou­rir les modi­fi­ca­tions de la branche master on ajoute --merges --first-parent histoire de ne pas voir les modi­fi­ca­tions internes des sous-branches. Ni vu, ni connu mais le débo­gage de la branche après coup en cas de besoin ne sera pas idéal.

    L’al­ter­na­tive est de fusion­ner en une seule toutes les modi­fi­ca­tions de la branche lors de son inté­gra­tion. On perd toute la granu­la­rité et ça peut rendre bien plus diffi­cile de tracer l’ori­gine d’une anoma­lie par la suite, ou de comprendre le pourquoi et le comment d’un chan­ge­ment. C’est encore viable sur 100 voire 200 lignes bien grou­pées mais ça devient fran­che­ment liti­gieux au delà.

    La seule pratique que je réprouve tota­le­ment est celle du rebase sans squash. On importe tous les chan­ge­ments direc­te­ment sur master et on perd tota­le­ment la capa­cité d’avoir un master stable. Ne faites pas ça.

    La troi­sième voie c’est la réécri­ture de l’his­to­rique.

    En théo­rie c’est mal, au moins pour les branches déjà publiées. En pratique tant qu’au­cun autre code ne se base dessus, ça ne pose pas vrai­ment de problèmes. Sur des équipes en entre­prise ça se maitrise assez bien. Sur du code open source ça me semble plus liti­gieux. Github le gère parfai­te­ment dans les pull-request en cours de revue.

    Les vrais, les purs, le font en ligne de commande. Je suis admi­ra­tif devant ceux qui savent décou­per une modi­fi­ca­tion ou ajou­ter un correc­tif dix chan­ge­ments en arrière dans l’his­to­rique sans réflé­chir ni tout casser. Tech­nique­ment ça ne pose pas vrai­ment de diffi­cul­tés mais c’est long, propice aux erreurs, et le moindre faux pas peut faire de gros dégâts irré­mé­diables. Je ne trouve pas les inter­faces graphiques inutiles pour tout ça.

    Et là, merci Patrick, gitup vient désor­mais à ma rescousse. L’in­ter­face est simpliste, pas toujours pratique, mais elle fait ce que je n’ai pas vu ailleurs.

    • Je suis capable de sépa­rer un chan­ge­ment en deux quelle que soit sa posi­tion dans l’his­to­rique ;
    • Je suis capable de dépla­cer un chan­ge­ment en haut ou en bas dans l’his­to­rique d’un simple raccourci clavier ;
    • Je suis capable de faire un correc­tif, le descendre dans l’his­to­rique, puis le fusion­ner avec le chan­ge­ment initial qu’il faut corri­ger.

    Tout ça graphique­ment, avec la possi­bi­lité de reve­nir en arrière quand je veux si jamais je fais des bêtises.

  • Éthique et Lima

    Le projet Lima s’éteint. C’est dommage. Je suis convaincu que les équipes de Lima ont fait tout ce qu’elles pouvaient pour que ça n’ar­rive pas. Des fois « on n’y arrive pas ». C’est dommage mais c’est ainsi et on doit plutôt remer­cier les gens d’avoir essayé.

    Les appa­reils concer­nés vont à terme deve­nir inuti­li­sables. C’est un bon exemple de « n’uti­li­sez pas d’ap­pa­reils connec­tés qui dépendent d’un service centra­lisé » mais à mon sens la leçon n’est pas celle là.

    Je n’aime pas tirer sur l’am­bu­lance mais mon problème est un problème éthique.

    What happens if CGC dies ?

    What’s good with Lima is that it’s enti­rely private and decen­tra­li­zed. So Lima can work inde­pen­dently from any servers, and conti­nue mana­ging your data even if our star­tup dies (disclo­sure: we don’t plan anything like that)

    The only thing we manage on our side of the equa­tions are updates of our app and the web inter­face of Lima. In case of company crash, we’ll do our best to open source at least the most criti­cal parts of our code, so the commu­nity conti­nues impro­ving the solu­tion every night.

    FAQ sur la page Kicks­tar­ter, le 6 août 2013

    La dispa­ri­tion de l’en­tre­prise a été envi­sa­gée dès le début de l’aven­ture (c’est bien) et des éléments de réas­su­rance ont été posés (c’est bien aussi, même si ce n’est que du best effort).

    J’ai un problème éthique parce que toutes les équipes de Lima, des fonda­teurs jusqu’aux déve­lop­peurs ont accepté de poser ces éléments de réas­su­rance alors qu’ils semblent faux.


    En pratique le serveur de l’in­fra­struc­ture Lima est un compo­sant essen­tiel et les boitiers vont progres­si­ve­ment arrê­ter de fonc­tion­ner. Ce n’est pas moi qui le dit, c’est Lima eux-mêmes. Là on est dans la trom­pe­rie pure et simple par rapport à la promesse affi­chée.

    While your Lima product synchro­nises with your devices without servers, our servers are still needed to make your devices find each other and esta­blish a connec­tion.

    Unfor­tu­na­tely, as our services shut down, your Lima will progres­si­vely stop to work.

    This time, it’s Good­bye. Page d’ac­cueil Lima

    La promesse de l’open source est simi­laire. En pratique il est impos­sible de passer le code open source une fois la société en liqui­da­tion. C’est confirmé par les réponses sur Twit­ter.

    C’est simple­ment légal. Les action­naires perdent le contrôle de la société et le liqui­da­teur a l’obli­ga­tion légale de tirer le maxi­mum des posses­sions de la société. Ça inclut le code source et la propriété intel­lec­tuelle. Libé­rer le code source gratui­te­ment n’est léga­le­ment plus possible.

    Le problème c’est que ce n’est pas une surprise.

    Il aurait fallu s’y prendre avant le début des diffi­cul­tés. Il aurait fallu dépo­ser le code source régu­liè­re­ment chez un tiers de confiance et s’en­ga­ger contrac­tuel­le­ment avec lui sur une cession de droits qui ne devien­dra effec­tive qu’à certaines condi­tions pré-établies.

    Même si la FAQ parle de « do our best », on est dans la trom­pe­rie. Il n’est pas imagi­nable que la ques­tion ait été abor­dée dans la FAQ et que les colla­bo­ra­teurs de l’en­tre­prise aient pu igno­rer les enjeux ci-dessus. Ils semblent pour­tant ne rien avoir prévu, consciem­ment, et avoir parti­cipé là aussi à un déca­lage signi­fi­ca­tif entre le discours et les actions.


    J’en veux aux déve­lop­peurs qui ont parti­cipé à ça, et qui vont mettre le doute sur tous les autres.

    Déve­lop­peurs, vous ne devriez pas mettre l’éthique de côté. Vous ne devriez pas appor­ter votre concours à des socié­tés qui trichent, qui trompent, peu importe le degré de cooli­tude du produit ou du service.