Créer des sondages html à partir de markdown

Allô,

Comme je n’avais rien de mieux à faire, j’ai exploré les API crypto de nos browsers pour enfin essayer les clés publiques/privées sur le web.

C’est parti d’un besoin simple pour mettre des sondages en ligne de façon simple (à partir d’un document markdown en fait) et compiler les réponses. Pour mes premiers tests j’ai utilisé https://www.jsonstore.io/ que (j’avais déjà mentionné) pour stocker les réponses. Par contre, tout est ouvert sur jsonstoreio (en lecture et en écriture) et c’est là que l’encryption asymétrique intervient.

J’ai mis une démo en ligne et le code source est sur GitHub:

Notez que c’est au stade proof of concept. Il faut faire plusieurs étapes manuellement (création des clés, token jsonstioreio, génération du sondage html, génération du lecteur de réponses, etc.) mais ça fonctionne.

Update

Si seulement l’aspect cryptographie vous intéresse, c’est basé sur un exemple plus simple:

C’est sans la conversion markdown et ça inclut la clé privée pour décrypter pour faire ça super simple.

Un truc important à venir c’est l’encryption de la clé privée elle-même. Dans le lingo webcrypto, on parle de wrapper des clés. Comme ça, on a besoin d’un mot de passe pour utiliser la clé (à la ssh/gpg, etc.).

As-tu un site de démo ? Ça a l’air intéressant l’encryption asymmétrique de l’API crypto des browsers.

@sebhtml Je vais mettre un démo en ligne sur les pages GitHub dans les prochaines minutes.

UPDATE: Voici la démo. Ça exige le JavaScript bien sûr, et ça roule 100% côté client. Enfin, les réponses sont envoyé sur jsonstoreio qui est vraiment très très lousse. On peut même consulter les réponses ici: https://www.jsonstore.io/2c4841590a7abcb280be5687bb872acb59318d99eae1704c8552fce86bfd1178/responses sauf qu’elles sont seulement décryptables avec la clé privée.

Merci !

Les réponses au sondage sont ici:

https://www.jsonstore.io/2c4841590a7abcb280be5687bb872acb59318d99eae1704c8552fce86bfd1178/responses

Dans view-source:https://millette.github.io/sondage-initial/main.3b81d6ce.js
est-ce que ce bout de JSON représente la clé publique utilisée pour encrypter les réponses ?

{alg:“RSA-OAEP-256”,e:“AQAB”,ext:!0,key_ops:[“encrypt”],kty:“RSA”,n:“yBqwDPHEwT6JfGexwwRC4sXxxISkD4Wocj-4mq1lQH7xgC6hqB6YkdV40kdWo0ysfqh-uzde8RahgeHfBs46mAdwAZtF2Ia3zIWStyMWi669gKvtIl1xPblqktIFRlq4dfkOOgFyx7Rq8dPn9l4UU6vKpZSJQJxORBtvZGdP5Z3fXejcj5EYDVzQuKuKXcab-haAjJcc6q2zqAIcLANfqQenJmCmyy14KF27sT8hMFxzj5xkaHZjfST998qSKYi7EcsxXcj8NeCzOaMIEa7NXdHTqWw32wZLVQQdc_IxK42jzkjHjWoJLoNAHArz3eJf8EyDVKbel0LN7AugQRzfDlKVEIgFGXeMuVxLoawpkiVhMm1Gb1IAJDJVqNNN0GTYFqT_SFhNWo_MotWRX3R1ul4yyIVVpkcF8GkSKVfbErscn_jLRfNg6JnyYiaW6iVPjkiPTcn_dipoxdEySUgnvXLI7nehJnKaAhDzVEXhNaqtIbmEvdkHnm7n9FBHlM1ZThDiSqnsbl78XQISOLbDACSrpGgmH0PwOqGegS4TDUUNqltnHJ_bSCl6GACID1lNvTwb94YLhi63qR5T_oAxI-wqC3bqOaLXPkcywWItvYlDucbXG0kh9JHSl8pwikdsEVwwOlAPlA7wv9gxHZnRHxgwnP-KeRWZ_ewJDxqEkRE”}

C’est donc impossible de relire les réponses encryptées sans avoir la clé privée correspondante.

Est-ce que tu as développé une interface pour consulter les réponses au sondage ?
Comment gères-tu le secret (la clé privée) ?

Autre question: est-ce que le caractère ‘$’ dans les noms de variables en Javascript a une signification particulière ?

Exactement. C’est le résultat de https://github.com/millette/sondage-initial/blob/master/gen-keys/gen-keys.js

Exactement.

Les sources sont ici: https://github.com/millette/sondage-initial/tree/master/gen-reader et je gère ça actuellement en gardant l’inferface sur mon localhost tout court. Je compte ajouter un password à la clé privée:

Le code de ce projet est particulièrement mauvais, vous m’en excuserez. En général, j’utilise $ comme préfixe pour indiquer que c’est une valeur du DOM.

Merci !

Ma question sur le symbole $ était par rapport à cette ligne dans https://millette.github.io/sondage-initial/main.3b81d6ce.js

return window.crypto.subtle.importKey(“jwk”,$K2Vj$$interop$default.d,e,!1,[“encrypt”])

En PHP, il faut mettre $ devant les variables. En Perl, c’est $ ou % ou @ (très bizarre).

Donc, je me demandais si $K2Vj$$interop$default.d est le nom d’une variable, ou encore si $K2Vj$$interop$default est le nom de la variable et d est un attribut, ou bien si c’est comme les data frames ou listes en R.

Il semble donc qu’en Javascript je peux nommer mes variables $, $$, $$$, $$$$, $$$$$$$ …

Aussi, j’aime bien ton utilisation abondante de “const”. Cette façon de faire me rappelle le scheme / lisp, où les variables ne sont pas modifiées après les avoir déclarées et définies.

Ah là c’est autre chose. Ça vient directement de

window.crypto.subtle.exportKey("jwk", key)

qui exporte un JSON. Celui-ci est stocké tel quel (m’enfin, en passant par la moulinette Parcel, ces $ viennent de là je crois) dans un fichier json séparé, mais https://fr.parceljs.org/ prend mes sources (incluant le json) et en fait un gros bundle.Le view source des fureteurs est moins utile depuis que tout est transpilé/bundlé.

En JavaScript, $ n’a aucune valeur spéciale dans le nommage des variables. Tout unicode est supporté (à quelques exceptions syntaxiques près), alors une variable pourrait se nommer allô avec l’accent et tout.

Pas mal tout le monde a vu $ en JS client vu que c’est le nickname de jQuery.

C’est trompeur en JavaScript ce const. Comme les objets sont passés par référence, on peut toujours faire

const allo = { bob: 42 }
allo.bob = "gérard" // js se fou pas mal des types aussi!

// interdit:
allo = { bob: 35 } // const empêche de réassigner seulement

Si tu veux un allo constant, faut utiliser freeze().

Dans Parcel, est-ce qu’il y a une option pour que le nom des variables contiennent seulement des 1 et des l et de longueur constante, comme:

l1l1l1l1
l11ll1l1

Ça rend ça plus obfusqué :wink:

J’ai fait du Javascript (prototype.js) il y a plusieurs années et $(“foo”) était pour obtenir l’élément du DOM avec id=“foo”. Je pensais que le $ était spécial à cause de ça.

Pour le const, moi, je me rappelle que j’utilisais “var” pour déclarer mes variables en JavaScript.

freeze(), a OK. Il y a ça aussi en Ruby (freeze, frozen?).

JS a beaucoup progressé, voici un résumé en 350 bullet-points si jamais tu voulais te mettre à jour :slight_smile:

Je présume que c’est rhétorique mais ce n’est pas le but de Parcel d’obfusquer le code. Si on regarde la ligne importKey à la source c’est plus clean:

Hey merci pour les liens. Je ne sais pas c’était quoi la version de JavaScript que j’utilisais il y a 5 ans, mais on disait souvent ECMA script, il me semble.

Dans ton lien, le Assignment Destructuring est bizarre je trouve !

J’ai compris l’exemple ici: https://javascript.info/destructuring-assignment

ECMAScript c’est le nom de la spécification. Pourquoi c’est pas ISO-…? J’ai oublié :wink:

On ne tracera pas la longue histoire de ce langage d’abord conçu en 10 jours avec une syntaxe qui ressemble au C au premier coup d’oeil mais qui cache en fait un genre de scheme le tout enrobé du nom Java qui gagnait beaucoup en popularité à l’époque des applets

Hehe. C’est vrai que c’est bizarre un peu l’histoire de JavaScript.

Dans le temps de Macromedia Flash, puis Adobe Flash, dans l’IDE de développement Flash, le code c’était essentiellement du ECMA script. Ça s’appelait le ActionScript. J’en ai fait en 2003-2005 !

En 2012-2015, j’avais utilisé la balise <canvas> pour faire du 2D. J’avais bien aimé.

Est-ce que dans Javascript ES6, il y a du nouveau pour le dessin ?

Je ne connais pas tellement cet aspect mais ce qui concerne les browsers se définit plutot au W3C (c’est pres de 1200 specs). Par contre, je sais qu’on peut mélanger SVG et HTML assez facilement, par exemple dans le site de cliparts que je mentionnais récemment ou encore le site de mon ami