Le point d’entrée du projet nebule vient d’être modifié : http://nebule.org/ et http://www.nebule.org/
La redirection est automatique vers l’introduction au bout de 15 secondes.
Ça ressemble à ça :
Le point d’entrée du projet nebule vient d’être modifié : http://nebule.org/ et http://www.nebule.org/
La redirection est automatique vers l’introduction au bout de 15 secondes.
Ça ressemble à ça :
La suite de l’article : Ajout de sentiments sur des objets.
Nouvelle liste :
Contenu de l’objet | ID objet |
Traduction |
‘nebule/emotion/jaime’ | eab748b4860d0046295503983e62dd0e228f3019c109a1b92fa08ff4f8e043e8 |
j’aime |
‘nebule/emotion/jaimepas’ | c8e99ab10169cca804e55601d7d36a142258516f98f66f050d6e6a48064b42f1 |
j’aime pas |
‘nebule/emotion/daccord’ | cd4ea3d3d8f5a883a183c70c6220f4e940aec30dc141c3bd9d6fd4bef71e48ad |
d’accord |
‘nebule/emotion/pasdaccord’ | 8a802c8da6a1d2bca6e5be6322db836e1eeab6373018b63c2f5363a33c0dc6b1 |
pas d’accord |
‘nebule/emotion/content’ | 4b0a16021e81fecb6d0826fcae528887366b13bfa3827ea5f516666e76255dab |
content |
‘nebule/emotion/mecontent’ | 6fc3cdf3045a102e4a3673bd275aa0d0c6755286fc7837bbb4b8014d47911c42 |
mécontent |
‘nebule/emotion/ange’ | 711e9834572990f90047119d60b99face50244c821503e8f3144afc45e4cd878 |
ange |
‘nebule/emotion/demon’ | eaea6bee6100be666b33c20f1ed0b27db45ccaac1f9e5a68ace68699a0eca9c5 |
démon |
‘nebule/emotion/fache’ | 3fb8db4d9e2c34f8b8ce7ab6189e17699d5a5348537847cbbdc91b13c2795ea5 |
fâché |
‘nebule/emotion/joyeux’ | 8fa02c09df434482d8e03cf640f9e38cc9192112b55254952f7ad5f332189c65 |
joyeux |
‘nebule/emotion/cool’ | 851aa3262613f15ab8529d5bd0c5ae9731e6f3c13977bf2b3e4bdb3881e8c4fc |
cool |
‘nebule/emotion/malade’ | 53715f876e7b1b99f3fd30fc2844fbbf0095c330517f85768c34a26d66eccdca |
malade |
‘nebule/emotion/triste’ | e8067acdc2bff25f753e16a47c21389445cad3116720eca7d96c0a94a127af75 |
triste |
‘nebule/emotion/pleur’ | 1d012502a87bff5319df1144fd34c4b7fbe5419e3661473c438654bec5aa923e |
pleur |
‘nebule/emotion/embarrasse’ | 1067be04d13efe1bce40b048d07cecedadce3cb93f9381a6dd6518561879ffa4 |
embarrassé |
‘nebule/emotion/mortderire’ | f4743808f03680cdbe93a0833747dedcc752b05bc345f6d40a7cfa770ad1515c |
mort de rire |
‘nebule/emotion/sourire’ | 3ac0bc7722ecd3577ea4f0900da73394dcd6ed89026ecc060238ffed20b692c0 |
sourire |
‘nebule/emotion/indifferent’ | fdd5af2d8cc900cfe4bdac1abc933923702dea8979ad129d6e5c91d0692fba08 |
indifférent |
‘nebule/emotion/compatissant’ | d07d249218d792894c6a29db2855ec74f3fa683c00e69f18f54c6e1f9f4f4f7c |
compatissant |
‘nebule/emotion/surpris’ | 7a082524fa239b988a6c08965cacc9744f0abdb47abed7fc05a9dccc29fec546 |
surpris |
‘nebule/emotion/fatigue’ | fc92036c0ba4fcb08e17c8feb169bfd85894651fa159bbba7a7e64caacc17ffa |
fatigué |
‘nebule/emotion/clindoeil’ | fb873b7364936f83e030f9014b3da16b8ebf3200a2041bd6f4aad5d3f93c63f9 |
clin d’Å“il |
‘nebule/emotion/neutre’ | b3943ed3e25a53bde4878908b2561c8714934a06124ce353ff053a6d55b971dd |
neutre |
‘nebule/emotion/interesse’ | 37bb4b6e73bade8ab63a9789c2e55fcd339c22324b0fdb73dbfe769f85067c30 |
intéressé |
‘nebule/emotion/inquiet’ | d70ee42f7297111aea7e0e92208d1a412534686b09126bd23553c4063026b733 |
inquiet |
‘nebule/emotion/serein’ | 3c01125b5301086b96a10268e0f8b6bbb1f61cc945a92af27071da0ef38812e2 |
serein |
‘nebule/emotion/bon’ | 4cc7d070932882316f41c2ff58718d78774d645615adc66f58f935726ed3d409 |
bon |
‘nebule/emotion/mauvais’ | a71eb2608c0fc1db599b0dd1966292fd7e875b9c066cbc475c1053abc7ac53b7 |
mauvais |
‘nebule/emotion/beau’ | e23e9897df93819b956dfc07e9af5e9969ff61ddcd342a6f9f6ba2b3de0783b1 |
beau |
‘nebule/emotion/moche’ | 63a9951625e6fd14f5e292b298b0d67876436837957a32e598f84851010fac0b |
moche |
‘nebule/emotion/genial’ | cdde23dc18a991125b18123842cff9931031595f03ed5d7c1c1bf4b93298b0fd |
génial |
‘nebule/emotion/moyen’ | bdc7d8160007fbca505c8cfa55822a9add89e595d9b999c37d205af618bb3fa1 |
moyen |
‘nebule/emotion/nul’ | 1c36d371280ae42fa065578f669bb74a22c000d1305717f115b2a87de49b41ec |
nul |
‘nebule/emotion/heureux’ | 87de40c16dff7c52192cfb98c2f7106eeb4efdb335665186775cae670df2358e |
heureux |
‘nebule/emotion/inutile’ | 802095dac6cdb18afe5269d481c357713d3fc1aaff907ee6d92de43bc44fb68f |
inutile |
‘nebule/emotion/ambigue’ | 117668a5eec9ef7b7a99ae1cddf22517cc8ca4cfb7d51c3db65a2ba5c22f1f10 |
ambiguë |
‘nebule/emotion/clair’ | 219a6c19d80e37c79b03a6e54ce479439b9415cdc33aa55a11672f86d6bf3b8f |
clair |
‘nebule/emotion/vrai’ | 44330b908390c34345301483a3f43917e85f2f62de8e409c9e5828621a10f719 |
vrai |
‘nebule/emotion/faux’ | f3ae0599a4a369171c0994421b2c353f23cb18c26235688d90e20f15c1821973 |
faux |
‘nebule/emotion/complet’ | 1b479bc5638c27c63e4016312df686689d5fec6ecdbbd4a6778118d4b6dfbaf0 |
complet |
‘nebule/emotion/incomplet’ | 7a926b54998f4fa06974045052bcdce906ce7d87df425f2ebd92a3bc1e511872 |
incomplet |
‘nebule/emotion/incomprehensible’ | 8d394acebf91abd1bafa8dec2aa9b411ab0fbe844cdc2cec1428c3fcab1d1c67 |
incompréhensible |
‘nebule/emotion/important’ | 793423a90c4b116aa01fbba3d5a214d00d1df3c8171aa0d927f2f9111f245b66 |
important |
‘nebule/emotion/perime’ | 8626a44d629629c787eab9833505503a0b20309574e0b0c1a0c15a1b3d3f8b80 |
périmé |
Le code de sylabe est à jour.
Les derniers développements de sylabe on permit de réactualiser l’ajout de marques tel que j’aime, j’aime pas et bien plus encore.
CF : Blog sylabe – Avancement
Ces marques sont regroupées sous le terme de sentiments. Ils sont matérialisés par des liens de type l
de l’objet vers le sentiment (un autre objet) et le méta ‘nebule/objet/sentiment
‘.
Ces sentiments ont une signification purement humaine. Le code de nebule ne l’interprète pas et n’en tient pas compte. Mais ces sentiments ont chacun des objets dédiés qui eux ont tout intérêt à être communs à toutes les applications. Ils doivent être propagés quoi qu’il arrive comme tout liens. C’est la raison pour laquelle ils seront définis au niveau de nebule.
Leur affichage sera spécifiquement traduit pour être plus lisible et tenir compte de la langue d’affichage. Continuer la lecture de Ajout de sentiments sur des objets
Le marquage du temps tel que réalisé aujourd’hui ne me convient que moyennement. Ce marquage est fait pour chaque lien et permet de leur donner un sens temporel.
La marque de temps est basée sur une norme reconnue : ISO 8601:2004. Elle est forcément absolue. Éventuellement, ce peut être un simple compteur incrémental.
Mais cette norme est loin d’être universelle. Elle se base exclusivement sur un calendrier grégorien. Donc sa référence de temps est biblique, ce qui a une connotation religieuse pour un sujet technique. Passe encore. De par sa référence et sa gestion du temps le plus grand, l’ordre de grandeur du temps géré est de quelques milliers d’années. En gros, on peut indiquer une date entre -9999 et 9999 années.
Certes, cela laisse de la marge dans nos sociétés modernes où on se préoccupe plus de la nano-seconde que du siècle. Mais les Mayas avaient à leur époque, il y quelques temps déjà , un calendrier pour gérer le temps profond. Leur calendrier était à même de donner une date à la création de la terre (si cela a un sens), et sans référence religieuse. Ils ne pouvaient pas par contre gérer finement le temps à petite échelle, en dessous de la journée…
Lorsque l’on aborde le sujet de la gestion du temps avec de multiples références, il faut penser au moyens de synchronisation de ces horodatages. Il faudra pour ça réactiver l’entité kronos…
Il n’y a pas 36 solutions pour améliorer le marquage du temps.
On peut ne plus reconnaître de format de temps standardisé… et tenter de déterminer par la forme de la marque de temps la date indiquée dans sa propre référence de temps. Ce travail, fastidieux, peut être facilité par un lien de définition de la marque de temps utilisée par une entité.
On peut reconnaître par défaut le format ISO 8601 et accepter d’autres formats sous la forme d’un compteur. Ce compteur, dans ce cas doit avoir une forme progressive dans le temps pour pouvoir être interprétée au moins comme compteur à défaut de pouvoir en extraire une date fiable.
On peut reconnaître par défaut le format ISO 8601, accepter le compteur et accepter un indice de formatage spécifique pour des marques de temps autres. Le compteur doit toujours être progressif.
Enfin, on peut ne reconnaître que le compteur et une marque de temps préfixée de sont type. Cette dernière solution intègre à peu près les marques de temps actuellement utilisées dans nebule au format ISO 8601 comme de simples compteurs.
Les objets sont aujourd’hui identifiés par une valeur unique qui, de part ses propriétés, n’est pas pré-calculable ou prévisible. Ce comportement est indispensable pour distinguer parfaitement et de façon univoque les objets, et donc leur contenu. Il résulte de ces propriétés que toute modification d’un objet, quelle qu’elle soit et aussi infime qu’elle soit, entraîne un changement complet et quasi-aléatoire de son empreinte, et donc de l’identifiant correspondant.
Mais il peut être aussi intéressant de disposer d’une autre valeur plus prévisible. On va essayer de définir ici ce que l’on appellera un marqueur.
On peut imaginer par exemple que deux images très proches puissent avoir un marqueur de valeur identique ou proche. Pour de la musique, le marqueur peut être un dérivé atemporel du spectre de fréquences. Ce marqueur doit avoir une structure en accord avec la structure de l’objet. On doit pouvoir comparer les marqueurs de deux objets différents et déterminer rapidement si ils ont une structure proche, donc si ils sont ressemblants. La structure doit être multidimensionnelle et de profondeur variable. L’ajustement de la profondeur de comparaison des marqueurs doit permettre de retrouver les objets très proches ou au contraire vaguement ressemblants.
Une notion de groupe apparaît. On fait un regroupement à géométrie variable des objets par rapport à leur contenu.
Le côté multidimensionnel du marqueur doit refléter les caractéristiques multidimensionnelles d’un objet. Voici quelques exemples :
Ce marqueur n’est pas destiné à remplacé l’identifiant !
L’identifiant reste le seul moyen de discerner sans ambiguïté tous les objets, y compris les plus ressemblants.
Ne reste plus qu’à formaliser précisément ce marqueur.
Une page Variables vient d’être mise en ligne. Elle regroupe les différentes variables utilisées par les librairies et modifiables par l’utilisateur (via les fichiers d’environnement), leurs valeurs par défaut ainsi qu’une description.
Sont concernées actuellement les variables en php, mais les variables en bash suivront…
Le bootstrap reconnait deux options en ligne bootstrap_load
et bootstrap_lib
. CF sybale – avancement du 02/03/2013.
Ces options ont pour but de permettre de choisir spécifiquement une version de sylabe et une version spécifique de la librairie php. Ce sera utile lors de problèmes de cohérences entre les versions de sylabe et de la librairie. Une incohérence peut conduire dans le cas d’une fonction absente à une erreur php, et donc à un affichage vide. Dans ce cas, forcer les versions permet de revenir à une situation stable et de corriger tranquillement le problème.
Mais ce mécanisme entraine un problème de sécurité. Il est possible de forcer ces options à la main et donc de choisir volontairement des versions de code anciennes, défectueuses ou mal protégées. Ce problème ne peut être résolu directement dans sylabe puisque les choix de codes se font dans le bootstrap. Il faut donc trouver et implémenter un mécanisme pour soit restreindre soit désactiver ces deux options directement dans le bootstrap. Il sera toujours temps de les réactiver le temps de résoudre un problème.
La suite au prochain épisode…
Jusque là , le code du bootstrap et de la librairie nebule en php était dépendant du projet sylabe.
Maintenant, ils sont détachés du projet sylabe et sont directement rattachés au projet nebule, ce qui est plus cohérent. Le projet sylabe va cependant continuer à s’appuier sur le bootstrap et la librairie nebule et même à les faire progresser.
Les codes actuellement en ligne, diffusés par l’entité bachue, sont disponibles ici :
– bootstrap
– librairie
CF : Projet sylabe – Migration du bootstrap et de la librairie
L’entité bachue existe depuis un certain temps en tant que telle. Mais il est difficile de diffuser dans de bonnes conditions les objets et liens qu’elle signe. De bonnes conditions sont ici à interpréter comme conditions de sécurité et facilité d’exploitation.
Cette entité est matérialisée par une clé RSA en deux parties, une publique et une privée. La clé privée doit être manipulée avec précaution dans un environnement strictement contrôlé. La perte ou la divulgation de la clé privée remettrait en question tout ce qui a été diffusée par cette entité, surtout si c’est du code. En terme de sensibilité, elle est en troisième position derrière puppetmaster et cerberus.
Les technologies employées actuellement ont toutes des vulnérabilités en ligne à certains moments. Si ces vulnérabilités peuvent être comblées, il n’en demeure pas moins une petite période de temps pendant lequel elles deviennent à la fois publiques et non encore comblées. Le problème est pire encore avec les vulnérabilités non publiques (0-days) contre lesquelles une machine unique ne peut pas avoir de défense efficace. Donc la machine qui héberge l’entité bachue, la machine hôte, ne peut être laissée connectée sur un réseau externe.
Tout ce qui est manipulé par nebule supporte sans aucun problème les transferts via le réseau ou via des supports amovibles et est manipulable sur des systèmes d’exploitations différents. Il est aisé de travailler avec des stations non connectées et de diffuser simplement l’information via des relais en ligne même plus faiblement protégés.
Chaque machine à un rôle strictement définit avec des règles de gestion en conséquences. Toutes les machines ne sont pas installées avec le même système d’exploitation et toutes les machines ne reposent pas sur la même architecture matériel. Des machines tournent notamment avec un processeur SUN SPARC ou un processeur PowerPC en plus des classiques processeurs Intel/AMD 32bits ou 64bits. Microsoft Windows a été écarté pour sa forte présomption (impossible à démontrer ou à réfuter) de compromission par des entités étatiques.
Voici le schéma de principe retenu actuellement pour la gestion des objets et liens par bachue :
1 – La station de développement est unique mais pourra s’étendre à plusieurs machines. C’est une machine assez classique et qui sert à bien d’autres choses que nebule. C’est actuellement le principal point de faiblesse, le principal point d’entrée d’une attaque.
1->2 – Depuis la station de développement, on exporte les liens et objets associés sur une clé USB vers la station hôte bachue.
2 – La station hôte est la seule et unique machine sur laquelle sera déverrouillée l’entité bachue. C’est la machine la plus critique du dispositif. Les seuls vecteurs d’attaque sont la clé USB et un accès physique frauduleux.
Toutes les clés USB insérées sont systématiquement nettoyées. Le nettoyage consiste en la suppression de tout fichier autre que le fichier ‘l’ ou ce qu’il y a dans le dossier ‘o’. Le fichier ‘l’ ne doit contenir que des caractères imprimables. Le dossier ‘o’ ne doit pas contenir de sous dossiers. Les fichiers du dossier ‘o’ doivent avoir une empreinte valide.
Si les liens sont ceux attendus, ils sont signés par l’entité.
Cette station ne se met pas à jour régulièrement des correctifs de sécurité. Ce processus est réalisé à la main si nécessaire. La machine est préparée pour résister aux deux vecteurs d’attaques connus.
2->3 – Les nouveaux liens sont exportés par la même clé USB vers le serveur relais.
3 – Le serveur relais contient une copie de ce que l’entité bachue partage publiquement. Il n’est pas très critique puisqu’une compromission serait facilement détectée dans les liens et objets. La suppression de certains objets ou liens serait facilement réparable. Ce serveur est protégé derrière un pare-feu qui bloque toute tentative de connexion depuis Internet vers le serveur ainsi que toute connexion non référencée depuis le serveur vers Internet.
Toutes les clés USB insérées sont systématiquement nettoyées. Le nettoyage consiste en la suppression de tout fichier autre que le fichier ‘l’ ou ce qu’il y a dans le dossier ‘o’. Le fichier ‘l’ ne doit contenir que des caractères imprimables. Les liens dans le fichier ‘l’ doivent être de bachue uniquement et leurs signatures sont vérifiées. Le dossier ‘o’ ne doit pas contenir de sous dossiers. Les fichiers du dossier ‘o’ doivent avoir une empreinte valide.
Ce serveur se tient automatiquement à jour de correctifs de sécurité directement sur Internet.
Les nouveaux objets sont ajoutés aux objets déjà présents. Les nouveaux liens sont insérés dans les fichiers de liens via la librairie nebule.
3->4 – L’ensemble des objets et liens sont synchronisés vers le serveur miroir public avec rsync encapsulé dans ssh.
4 – Le serveur miroir est un serveur web disponible en permanence sur Internet. Il n’est pas critique dans sont contenu puisque toutes modifications des objets ou liens seront immédiatement rejetées par les autres entités. Il n’est que peut critique en terme de disponibilité puisque les objets et liens peuvent être diffusés par d’autres entités. Il n’est pas critique non plus en terme de sensibilité des données qu’il partage puisque toutes les données sont soit librement publiables soit chiffrées.
Ce serveur se tient automatiquement à jour de correctifs de sécurité directement sur Internet.
4->5 – Chaque entité peut venir consulter les liens et objets sur le serveur miroir public.
5 – La station cliente est autonome. Elle gère ses propres processus et assure sa propre protection.
La librairie nebule de référence en php gère maintenant les liens de mise à jour d’objets conformément à la méthode décrite dans l’article sur la Résolution d’un graphe de relations de mise à jour.
Cette fonctionnalité qui paraît au premier abord peu utile tous les jours est en fait primordiale pour diffuser de façon sécurisée les mises à jours de logiciels. Le premier programme à en bénéficier est sylabe. La diffusion du code sous forme d’objet a déjà commencé : Gestion des versions de sylabe – mise en ligne
Ainsi, le code de sylabe va pouvoir être très facilement tenu à jour avec la toute dernière version. Mais cela va aussi grandement simplifier l’installation puisque le code de bootstrap va être capable d’aller automatiquement récupérer immédiatement la dernière version de sylabe avant de permettre son utilisation.
Nous arrivons dans le projet nebule à un point de singularité. Alors que jusque là , les fichiers mais aussi les entités (les utilisateurs) avaient été intégrés à nebule sous forme d’objets, le code de nebule restait lui en dehors des objets. Maintenant, le code de gestion des liens et objets devient lui aussi un objet géré par des liens comme tout objet.
Le code sera initialement signé et diffusé par l’entité bachue. Tout entité à jour deviendra à son tour point de redistribution du code.
La mise en place dans sylabe du code nécessaire à la résolution du graphe des mises à jours d’un objet montre que l’on peut créer une sorte de raccourci d’objet.
Ce détournement ne pose à priori pas de problème puisqu’il sera impossible de créer un objet avec cette empreinte réduite et que toute tentative se traduira par un rejet de l’objet lors de la vérification d’intégrité.
L’utilisation des liens de mise à jour d’objets est utilisé dans des cas biens spécifiques mais revêt une grande importance par exemple dans la mise à jour de programmes. Cela a notamment des implications sur la sécurité des programmes gérés sous forme d’objets.
Les liens de mise à jour n’ont pas de contraintes et peuvent donc créer des graphes de liens entre objets de forme quelconque. Cependant, l’usage de ces liens dans nebule nécessite que pour un objet donné on obtienne un unique autre objet. Cet objet doit être disponible puisque l’on est dans le cas d’un usage, c’est à dire de son utilisation immédiate.
La résolution d’un graphe de liens permet d’obtenir l’identifiant un objet dérivé unique et disponible pour un objet de départ en tenant compte de la validité des liens. Cette résolution est spécifique à nebule et se fait sous forme arborescente en ne tenant compte de des liens descendants et non bouclés.
Table des matières :
Cette méthode de résolution va maintenant être expérimentée grandeur nature dans sylabe pour la gestion des versions des programmes. Continuer la lecture de Résolution d’un graphe de relations de mise à jour
Le code de sylabe, en php, est corrigé pour répondre au problème d’interopérabilité du chiffrement.
CF Avancement
Le code en bash doit encore être corrigé.
Maintenant que l’IV est utilisé par défaut avec une valeur nulle, il n’a plus à être précisé. Le lien qui était généré vers l’objet nebule/objet/encode/InitialVector
pour le préciser n’a plus de raison d’être utilisé.
Il en est de même pour la clé de session. L’objet de la clé de session apparaît naturellement dans les deux liens de chiffrement. Il n’est donc pas nécessaire de re-préciser que c’est une clé de session. Il n’est d’ailleurs pas utilisé dans le processus de déchiffrement. Le lien vers nebule/objet/encode/SessionKey
ne sera donc plus généré.
Et de fait, l’objet nebule/objet/encode
n’a plus d’utilité non plus. La documentation de nebule v1.1 est mise à jour en conséquence. On supprime ces objets réservés :
Voici la suite sur les problèmes d’implémentations de la cryptographie symétrique tel que décris dans OpenSSL et la cryptographie et Interopérabilité du chiffrement(blog sylabe).
Après quelques tests sur le chiffrement symétrique avec la commande openssl et son équivalent en php, j’ai trouvé les bonnes implémentations pour obtenir le même chiffre à partir des mêmes valeurs en entré.
Il y a à la fois une erreur dans l’implémentation de openssl dans nebule en bash, et une autre erreur d’implémentation de openssl dans sylabe en php.
En bash, la commande openssl enc
était appelée avec l’option -kfile
alors qu’il faut utiliser l’option -K
.
Il faut en plus utiliser l’option -nosalt
pour ne pas ajouter de sel et donc notamment avoir un objet chiffré de taille strictement identique à l’objet en clair.
Voici une courte implémentation qui marche, dans le cadre d’emploi de nebule exclusivement :
#!/bin/bash nebule_symalgo="aes-256-ctr" iv='00000000000000000000000000000000' echo -n "477fd3f3a32dc5de70cf13d1e46d8663f5f23873826572ea8359064b6d63c60c2d76f29a5e34fac2aebb157975517ef23110f4a5e415d9d0408f6fe7b9fe17bdd6bbb2df3fb819ecbd5216835ecccc559e7eb84e0517e92538d9a81fec333498a64b90df3429abe857ba1666fc93b24509e63d05fd619da9eef12c8d70dbacca" > /tmp/bdata key='8fdf208b4a79cef62f4e610ef7d409c110cb5d20b0148b9770cad5130106b6a1' openssl enc -e -$nebule_symalgo -in "/tmp/bdata" -out "/tmp/bcode" -K $key -iv $iv -nosalt -p sha256sum /tmp/bcode
En php, la commande openssl_encrypt
recevait la clé de chiffrement hexadécimale alors qu’il faut la transmettre sous forme binaire.
Par défaut, aucun sel n’est utilisé.
Enfin, l’IV peut avoir une valeur nulle contrairement à ce qu’affirme la documentation. Ce doit être une erreur de traduction. La valeur de doit pas avoir une taille nulle.
Voici une courte implémentation qui marche, dans le cadre d’emploi de nebule exclusivement :
<?php $nebule_symalgo = 'aes-256-ctr'; $data="477fd3f3a32dc5de70cf13d1e46d8663f5f23873826572ea8359064b6d63c60c2d76f29a5e34fac2aebb157975517ef23110f4a5e415d9d0408f6fe7b9fe17bdd6bbb2df3fb819ecbd5216835ecccc559e7eb84e0517e92538d9a81fec333498a64b90df3429abe857ba1666fc93b24509e63d05fd619da9eef12c8d70dbacca"; $hiv='00000000000000000000000000000000'; $iv=pack("H*", $hiv); $hkey="8fdf208b4a79cef62f4e610ef7d409c110cb5d20b0148b9770cad5130106b6a1"; $key=pack("H*", $hkey); $cryptobj=openssl_encrypt($data, $nebule_symalgo, $key, OPENSSL_RAW_DATA, $iv); $hashcryptobj=hash('sha256', $cryptobj); echo "E=$hashcryptobjn"; ?>
Un article de Wired parle de WatchDox, une (relativement) nouvelle solution de partage de données incluant une protection au niveau de la donnée elle-même.
En résumé, c’est un système type nuage (cloud computing) qui s’interface avec la suite Office de Microsoft et la visionneuse de PDF de Adobe. L’utilisation est donc assez pratique pour qui est full Microsoft, mais aussi assez bridée de fait.
Le véritable intérêt, et ce qui le démarque de la concurrence, c’est que la protection de la donnée se fait au niveau de la donnée elle-même. Ce n’est pas géré de façon globale sur un serveur par des droits génériques et hérités mais qui ne s’appliquent que sur le serveur.
Il est notamment possible d’interdire la retransmission d’un document ou son impression, et plus encore. Cela ressemble beaucoup comme ça à ce que permet le PDF si on utilise les outils de Adobe, justement…
Il y a aussi une fonctionnalité de traçage des consultations. Chaque destinataire légitime d’un document peut l’ouvrir. Le propriétaire, l’expéditeur, sait qui l’a consulté et quand.
Au début, je me dis que j’ai enfin quelque chose qui ressemble à nebule, une gestion et une sécurisation des documents pensées au niveau du document lui-même. Il va être possible de confronter les principes sous-jacents à nebule avec quelque chose de proche…
L’enchantement ne dure pas longtemps. Pour remettre tout de suite le contexte de WatchDox, la société n’est pas encore rentable avec 10M$ de revenus annuels.
Ensuite, oui on gère des droits de diffusion au niveau de chaque documents. Mais on est finalement loin de nebule dans le fonctionnement. La donnée est chiffrée et taguée avec des droits. Ces droits sont des droits dits faibles parce qu’ils vont à l’encontre d’une règle simple : toute information que l’on transmet, on en perd irrémédiablement le contrôle.
Alors, ou est l’ambiguïté ? C’est simplement que cette solution repose sur le programme qui gère les données. La cryptographie permet de s’assurer que la donnée ne sera pas volée en cours de transmission, mais la sécurité des restrictions de (re)partage des données ne tient que sur le programme. De plus, bien que l’on puisse imaginer un cache local des données chiffrées, il faut impérativement être connecté pour exploiter les données et ainsi permettre à la traçabilité de fonctionner.
Cela veut dire qu’il est impossible de rendre publique le code du programme ou même son fonctionnement. Sinon il deviendrait possible de concevoir un programme pour manipuler les données en récupérant (légitimement) la clé de chiffrement mais aussi par exemple en permettant d’outrepasser les restrictions de partage.
Cela exclu aussi de fait toute standardisation ou interopérabilité de cet outil à d’autres produits plus ouverts, une implémentation libre par exemple.
Cette solution ne peut donc prétendre interdire la perte d’information, c’est conforme à la théorie. D’ailleurs, l’article reconnaît qu’il est toujours possible de voler l’information qui s’affiche à l’écran, même en mode paranoïaque. Elle permet quand même d’augmenter sensiblement la difficulté du vol d’information. Il reste à voir comment la gestion des droits va se passer au bout de quelques années et avec plusieurs centaines de milliers de documents…
Il reste la partie chiffrement des données dans le nuage qui peut sérieusement justifier la mise en place d’une solution comme WatchDox. Mais quelle confiance peut-on avoir en un système pour lequel on ne peut espérer obtenir le fonctionnement réel, et donc sur lequel aucun audit de sécurité sérieux et impartial ne peut être mené ?
La page de description du projet nebule est terminée. Elle pourra subir quelques ajustements mineurs si besoin.
La mise en place du chiffrement/déchiffrement dans sylabe, l’implémentation de nebule en php, révèle quelques problèmes et spécificités de OpenSSL.
Lorsque il a fallu déchiffrer avec la commande openssl les objets chiffrés depuis sylabe, ça n’a pas marché.
Les objets chiffrés par sylabe, qui utilise openssl dans php, peuvent être déchiffrés par sylabe. Les objets chiffrés par nebule en bash, qui utilise la commande openssl, peuvent être déchiffrés via la même commande en bash. Le point commun est l’utilisation de la librairie openssl. Mais en pratique un objet chiffré dans sylabe que l’on essaye de déchiffrer avec la commande openssl (via nebule en bash) retourne une erreur ‘Bad Magic Number’. Et l’inverse ne marche pas non plus. Ah, c’est moche…
Le problème ici est lié à l’utilisation d’un ‘salage’ (salt). Cette valeur est générée aléatoirement par openssl pour complexifier le mot de passe de chiffrement et réduire les attaques par dictionnaire de mots de passe pré-hashés (rainbow-table). Le sel est une valeur publique contrairement au mot de passe, et doit impérativement être envoyé avec le fichier chiffré. Le salage est un renforcement de la procédure de chiffrement et non du mot de passe lui-même. Pour que le sel soit transmit avec les données chiffrées, openssl ajoute un petit entête aux données chiffrées avec notamment la valeur du sel. Il en résulte une petite augmentation de la taille du fichier des données chiffrées de 16octets. Or, la librairie openssl utilisée dans php ne génère pas de sel, les données chiffrées et non chiffrées ont la même taille.
Quelle solution apporter ?
Il est possible de gérer cet entête de fichiers chiffrés dans le code php. Cela entraîne une augmentation de la complexité du chiffrement/déchiffrement mais permet de conserver un comportement commun avec les objets actuellement générés en bash. Cette compatibilité ‘commune’ n’est pas universelle puisqu’elle n’est pas gérée par la librairie openssl dans php, et donc peut-être pas non plus dans d’autres environnements.
On peut aussi ne pas permettre d’utiliser un entête particulier et de gérer le salage de la même façon que l’IV. Cette solution casse la gestion des objets chiffrés actuels mais surtout complexifie les liens de chiffrement.
Une autre solution serait de ne pas utiliser le salage du tout. Une option de openssl le permet : -nosalt
. Cela permet d’avoir un chiffrement plus simple et des objets chiffrés plus propres, et donc une implémentation plus universelle du chiffrement. On va cependant à l’encontre des recommandations faites par les développeurs de OpenSSL. Et on ré-ouvre potentiellement par dictionnaire pré-calculés.
Mais a-t-on vraiment besoin du salage ?
Le salage permet en fait de renforcer la sécurité de mots de passes potentiellement faibles ou à la limite de l’attaque par force brute.
Le chiffrement des objets dans nebule impose l’utilisation d’une clé de session aléatoire. Si l’espace des valeurs des clés de sessions est aléatoire et suffisamment grand, une attaque par dictionnaire est impossible. C’est impossible parce qu’il est dans ce cas précis impossible de pré-calculer et encore moins de stocker dans un dictionnaire l’intégralité des valeurs possibles. Un espace des valeurs de clé suffisamment grand peut se comprendre par une entropie correspondant à 128bits et plus.
Le script bash référence de nebule génère actuellement une clé de session de 64octets de valeurs hexadécimales, soit 256bits d’entropie réelle. Le code php de sylabe génère actuellement une clé de session de 128octets aléatoires, soit 1024bits d’entropie réelle.
Donc, le salage va être volontairement supprimé dans le chiffrement des objets tel que mis en place dans nebule.
Un problème similaire existe avec l’IV (Initial Vector, vecteur initial ou semence).
Lorsque l’on réalise un chiffrement symétrique, celui-ci se fait typiquement par blocs de données. Ce découpage peut entrer en interférence, en quelque sorte, avec les données à chiffrer. Si ces données sont répétitives suivant la taille du bloc ou un multiple, alors les blocs de données chiffrées correspondantes vont être identiques. Et cette répétition est détectable et fourni des informations sur le contenu non chiffré…
Pour remédier à ce problème, il existe différentes méthode d’organisation du chiffrement (pour le même algorithme de chiffrement) que l’on appelle modes d’opération. Certains modes introduisent un chaînage entre des blocs contiguës pour camoufler les données répétitives. D’autres modes mettent en place d’un compteur par bloc qui sera combiné avec les données pour forcer un peu de variabilité entres blocs répétitifs.
Il reste cependant à traiter le premier bloc. Pour cela on utilise l’IV qui est soit la première valeur pour le chaînage soit la première valeur du compteur en fonction du mode d’opération. Parce que sinon ce premier bloc, chiffré avec le même mot de passe, donnera le même bloc chiffré et donc trahira un début de données identique entre plusieurs fichiers chiffrés. L’IV est une valeur publique contrairement au mot de passe, et doit impérativement être envoyé avec le fichier chiffré.
Mais a-t-on vraiment besoin de cet IV ?
Comme dans le cas du salage, l’utilisation de d’une clé de session aléatoire et différente pour chaque objet fait que, même pour un contenu identique dans les premiers blocs, cela donnera des blocs chiffrés différents.
Donc, le vecteur initial va être volontairement supprimé dans le chiffrement des objets tel que mis en place dans nebule.
Premier problème suite à ça, l’instruction en php openssl_encrypt
nécessite un paramètre IV non nul…
Pour l’instant, les entités sont figées. Mais il faudra prévoir de changer leurs mots de passes et de les migrer vers de nouvelles entités au besoin.
Le changement de mot de passe nécessite de régénérer l’objet de clé privé qui change. Il faut évidemment préalablement déverrouiller l’entité, donc sa clé privée. Une fois le mot de passe changé, il faut lier la nouvelle clé privée à la clé publique puis supprimer le lien de l’ancienne clé privé. Il faut marquer à supprimer l’objet de l’ancienne clé privée.
Dans le cas d’une migration d’entité, c’est un peu plus complexe. Ce besoin répondra souvent suite à un problème de compromission ou de corruption d’entité.
Il faut générer une nouvelle entité autonome. Faire un lien de mise à jour de l’ancienne entité vers la nouvelle. Dans la mesure du possible, ce lien de mise à jour doit être signé à la fois par l’ancienne et la nouvelle entité. Puis l’objet de la clé privée de l’ancienne entité doit être marqué à supprimer à la fois par l’ancienne et la nouvelle entité.
Si l’entité avait été corrompue, c’est à dire qu’il était impossible de la déverrouiller, c’est un vrai problème. Dans ce cas, les liens de mise à jour d’entité et de suppression de clé privée ne pourront être signés par l’ancienne entité. rien ne permet de distinguer une opération légitime suite à un problème d’une tentative de détournement par une autre entité. Il peut tout au plus être possible de regarder si l’entité génère de l’activité, donc qu’elle n’est pas corrompue.
En cas de compromission de l’entité, on peut faire une mise à jour vers une nouvelle entité. Mais celui qui a volé la clé privée de l’entité peut le faire aussi de son côté. Il est difficile dans ce cas de déterminer qui est la véritable nouvelle identité et pas une usurpation… Peut-être le côté sociale, comportemental, d’une entité peut nous aider à posteriori?
Ceci est une réflexion personnelle, mais comme elle concerne le traitement sécurisé de certaines données, je pense qu’elle a aussi sa place sur le blog nebule.
Le vote électronique, vu par un non spécialiste, est un monde assez étrange. D’un côté une grande variété de sociétés commerciales qui disent toutes avoir trouvé le système parfait, et j’image un minimum rentable. De l’autre côté une variété tout aussi diverse de personnalités du monde de la sécurité informatique (peut-être un peu usurpée pour certaines) qui s’évertuent à démonter les fameuses solutions miracles et commerciales. Démonter est à prendre dans le sens commun, mais aussi dans le sens péjoratif.
En y regardant de plus près, on découvre que certaines réflexions ont déjà été menées, par exemple par la Commission Nationale de l’Informatique et des Libertés (CNIL). On trouve notamment la Délibération n° 2010-371 du 21 octobre 2010 portant adoption d’une recommandation relative à la sécurité des systèmes de vote électronique. Mais on trouve aussi des avertissements sur les produits de certaines sociétés.
On peut regarder un résumé de délibération de 2010 comparée à celle de 2003. On y parle toujours de sécurité du système hôte et de son (ses) logiciel(s) et de scellement. Ce scellement est finalement quelque chose que l’on pourrait assez facilement mettre en place avec un système comme nebule, c’est nativement sa façon de fonctionner…
Mais on accepte aussi désormais de faire de la virtualisation sur le système centrale !?
Pardon?
Cela veut dire de fait la nécessité de certifier aussi l’intégralité de la plate-forme de virtualisation au même niveau que les serveurs dédiés aux votes. Pourquoi vouloir complexifier la chose alors qu’il est nécessaire au contraire de simplifier l’ensemble du système si on veut espérer pouvoir le certifier. Autant mettre le serveur dans les nuages (le cloud) tant qu’on y est…
Mais quelles sont les exigences d’un vote?
On parle ici de confidentialité du vote. Ici de reproductibilité, traçabilité et intégrité. Ici d’impossibilité de vérification de la machine. Etc…
Le code électoral est de son côté une mise en application mais ne décrit pas les fondements, les principes.
Bref, bon courage pour ceux qui voudraient essayer de comprendre quelque chose au débat et démêler les intérêts de chacun…
Je propose de repartir du début. Que représente le vote pour moi ?
Certaines règles sont optionnelles :
Pour résoudre toutes ces demandes :
L’identification peut être faible (papier) ou forte (signature cryptographique). Dans le cas du vote papier, le votant prouve son identité avec sa pièce d’identité. Un registre empêche le rejeu du vote. Un unique papier permet de matérialiser le vote pour un candidat. Si l’ensemble de la chaîne de vote est solide, cela revient à faire un lien entre un votant unique et un candidat unique. Avec nebule, il suffit de ne prendre que le dernier lien vers les candidats, ainsi un seul vote est possible.
Comment peut-on gérer un anonymat du vote?
Le lien direct et public entre votant et candidat ne permet pas de maintenir l’anonymat. Pourtant celui-ci est nécessaire mais pas obligatoire. Un votant peut très bien décider de rendre public son vote. C’est dans ce cas au votant de casser l’anonymat de son vote.
On peut donc accepter une entité anonyme, dépendante de notre vraie entité, pour voter. Il faut prévoir le mécanisme qui permet à une autorité de reconnaître cette entité dépendante comme étant l’entité qui a le droit de vote, et elle seule. Ce mécanisme doit inclure des liens secrets entre les entités maîtres et les entités votant réellement.
A gratter…