Ce sujet a été résolu
Socle crypto web terminé; Chiffrement; Déchiffrement; Signature client-side;
Serveur -> relai de ciphertexts uniquement
Serveur -> relai de ciphertexts uniquement
il y a 5 heures
(Je fais une messagerie cryptée de bout en bout avec forward secrecy par message; pas de post-compromise secrecy pour l'instant, mais je suis pas sûr d'avoir la motivation de m'en occuper, ça a pas l'air simple...
Le client est codé en js vanilla navigateur en utilisant l'API WebCrypto pour la cryptographie.
Je vais faire un client android, parce que je soupçonne des limitations inter-navigateurs..
Par exemple, j'ai du adapter mon code pour Brave/Chrome/Chromium parce que les SharedWorkers fonctionnent pas de la même façon sous firefox, et j'utilise ce SharedWorker pour le chiffrement (la clef privée réside uniquement dans le worker (après déchiffrement biensûr, je stocke pas de façon pérenne une clef en clair (évidemment))
Le client est codé en js vanilla navigateur en utilisant l'API WebCrypto pour la cryptographie.
Je vais faire un client android, parce que je soupçonne des limitations inter-navigateurs..
Par exemple, j'ai du adapter mon code pour Brave/Chrome/Chromium parce que les SharedWorkers fonctionnent pas de la même façon sous firefox, et j'utilise ce SharedWorker pour le chiffrement (la clef privée réside uniquement dans le worker (après déchiffrement biensûr, je stocke pas de façon pérenne une clef en clair (évidemment))
il y a 5 heures
M30w
5h
(Je fais une messagerie cryptée de bout en bout avec forward secrecy par message; pas de post-compromise secrecy pour l'instant, mais je suis pas sûr d'avoir la motivation de m'en occuper, ça a pas l'air simple...
Le client est codé en js vanilla navigateur en utilisant l'API WebCrypto pour la cryptographie.
Je vais faire un client android, parce que je soupçonne des limitations inter-navigateurs..
Par exemple, j'ai du adapter mon code pour Brave/Chrome/Chromium parce que les SharedWorkers fonctionnent pas de la même façon sous firefox, et j'utilise ce SharedWorker pour le chiffrement (la clef privée réside uniquement dans le worker (après déchiffrement biensûr, je stocke pas de façon pérenne une clef en clair (évidemment))
Le client est codé en js vanilla navigateur en utilisant l'API WebCrypto pour la cryptographie.
Je vais faire un client android, parce que je soupçonne des limitations inter-navigateurs..
Par exemple, j'ai du adapter mon code pour Brave/Chrome/Chromium parce que les SharedWorkers fonctionnent pas de la même façon sous firefox, et j'utilise ce SharedWorker pour le chiffrement (la clef privée réside uniquement dans le worker (après déchiffrement biensûr, je stocke pas de façon pérenne une clef en clair (évidemment))
Tu as l'air motivé, ça ne doit pas être tout simple en effet..
il y a 5 heures
Je n'ai rien pigé
Ne jugez pas mon silence, il est rempli de cris
il y a 5 heures
Je n'ai rien pigé
Tu vois whatsapp ?
Bah c'est un peu la même chose que j'essaye de faire.
Quand tu discutes avec quelqu'un sur whatsapp, on dit que la discussion est chiffrée de bout en bout, c'est à dire que par des moyens cryptographiques, on t'assure qu'uniquement le destinataire peut lire tes messages, et quand tu reçois un message, on t"assure que toi seul peut le déchiffrer..
Après, je soupçonne whatsapp de garder trace du matériel cryptographique pour décrypter les communications en cas de réquisition judiciaire.
(moi c'est pas le cas, l'application permet un réel chiffrement de bout en bout, tous les secrets sont stockés de façon sécurisée côté client, sauf pendant le runtime sur brave, j'ai pas réussi à contraindre la clef dans le sharedworker donc je stocke temporairement une clef privée ECDH dans le sessionStorage, moyen... mais bon flemme)
Bah c'est un peu la même chose que j'essaye de faire.
Quand tu discutes avec quelqu'un sur whatsapp, on dit que la discussion est chiffrée de bout en bout, c'est à dire que par des moyens cryptographiques, on t'assure qu'uniquement le destinataire peut lire tes messages, et quand tu reçois un message, on t"assure que toi seul peut le déchiffrer..
Après, je soupçonne whatsapp de garder trace du matériel cryptographique pour décrypter les communications en cas de réquisition judiciaire.
(moi c'est pas le cas, l'application permet un réel chiffrement de bout en bout, tous les secrets sont stockés de façon sécurisée côté client, sauf pendant le runtime sur brave, j'ai pas réussi à contraindre la clef dans le sharedworker donc je stocke temporairement une clef privée ECDH dans le sessionStorage, moyen... mais bon flemme)
il y a 5 heures
Enregistrement de compte :
- Génération d'une paire de clef ECDSA pour la signature/authentification.
- Génération d'une paire de clef ECDH pour l'établissement de secrets partagés entre utilisateurs.
- Stockage côté client après chiffrement AES-GCM des clefs privées via une clef dérivée de la passphrase utilisateur (PBKDF2)
- Stockage dans IndexedDB et dans un fichier de restauration JSON (chiffré évidemment).
Login/Authentification:
- username
- password
- passphrase
- Clefs Chiffrées (IndexedDB ou fichier d'authentification auxiliaire)
- Décryptage des clefs privées ECDSA et ECDH
- Réception d'un nombre à usage unique (nonce) depuis le serveur
- Signature du nombre, envoie au serveur, puis véification de la signature côté serveur en utilisant la clef publique de l'utilisateur (stockée côté serveur);
- Si la vérification passe, on log + authentifie l'utilisateur via l'authentification/login django.
- 2 couches d’authentification distinctes, l'authentification crypto, locale (capacité à déchiffrer les clefs ou non via une passphrase) et serveur dans la mesure où on vérifie la signature du nonce en partant de la clef publique stockée dans la base de données.
Créér une discussion :
- publique / privée
Rejoindre une discussion :
- publique (tout le monde)
- privée (pas implémenté)
Discuter :
Discussion de 2 à N utilisateurs :
Signature du payload canonique du message, confirme l'id de l'émetteur, l'id du chat et la clef publique ECDH de l'emetteur.
Chaque message est chiffré N fois -> N ciphertexts -> 1 ciphertext par destinataire; avec une seule paire de clef épémère ECDH.
Pseudo Algo de chiffrement (n'inclus pas la signature) :
ciphertexts = []
(ESK_A, EPK_A) = generateECDHKeyPair()
Pour chaque destinataire :
S = ECDH(ESK_A, destinataire.PK) // Calcul du secret partagé
salt = hash(EPK_A || destinataire.PK)
K = HKDF(S, salt, info="VaultChat_Message") // Dérivation de clef
nonce = secure_random(16) // 16 bytes (128 bits)
MSG(n) = AES-ENCRYPT(K, plaintext, nonce) // Chiffrement du message via AES-GCM.
ciphertexts <- MSG(n)
Et je vais m'arrêter la parce que personne va lire de toute façon mais ça m'amuse.
- Génération d'une paire de clef ECDSA pour la signature/authentification.
- Génération d'une paire de clef ECDH pour l'établissement de secrets partagés entre utilisateurs.
- Stockage côté client après chiffrement AES-GCM des clefs privées via une clef dérivée de la passphrase utilisateur (PBKDF2)
- Stockage dans IndexedDB et dans un fichier de restauration JSON (chiffré évidemment).
Login/Authentification:
- username
- password
- passphrase
- Clefs Chiffrées (IndexedDB ou fichier d'authentification auxiliaire)
- Décryptage des clefs privées ECDSA et ECDH
- Réception d'un nombre à usage unique (nonce) depuis le serveur
- Signature du nombre, envoie au serveur, puis véification de la signature côté serveur en utilisant la clef publique de l'utilisateur (stockée côté serveur);
- Si la vérification passe, on log + authentifie l'utilisateur via l'authentification/login django.
- 2 couches d’authentification distinctes, l'authentification crypto, locale (capacité à déchiffrer les clefs ou non via une passphrase) et serveur dans la mesure où on vérifie la signature du nonce en partant de la clef publique stockée dans la base de données.
Créér une discussion :
- publique / privée
Rejoindre une discussion :
- publique (tout le monde)
- privée (pas implémenté)
Discuter :
Discussion de 2 à N utilisateurs :
Signature du payload canonique du message, confirme l'id de l'émetteur, l'id du chat et la clef publique ECDH de l'emetteur.
Chaque message est chiffré N fois -> N ciphertexts -> 1 ciphertext par destinataire; avec une seule paire de clef épémère ECDH.
Pseudo Algo de chiffrement (n'inclus pas la signature) :
ciphertexts = []
(ESK_A, EPK_A) = generateECDHKeyPair()
Pour chaque destinataire :
S = ECDH(ESK_A, destinataire.PK) // Calcul du secret partagé
salt = hash(EPK_A || destinataire.PK)
K = HKDF(S, salt, info="VaultChat_Message") // Dérivation de clef
nonce = secure_random(16) // 16 bytes (128 bits)
MSG(n) = AES-ENCRYPT(K, plaintext, nonce) // Chiffrement du message via AES-GCM.
ciphertexts <- MSG(n)
Et je vais m'arrêter la parce que personne va lire de toute façon mais ça m'amuse.
il y a 5 heures
Je peux fièrement confirmer que l'app est fonctionnelle sur firefox/brave desktop et aussi firefox mobile.
Je vais tester brave mobile.
Je vais tester brave mobile.
il y a 4 heures
L'authentification foire sur brave mobile :s ...
(pour une raison étrange il n'arrive pas à signer le nonce reçu du serveur)
Donc l'app android s'impose comme suite logique.
(pour une raison étrange il n'arrive pas à signer le nonce reçu du serveur)
Donc l'app android s'impose comme suite logique.
il y a 4 heures
hé bien, t'es une tête dit donc !
même si je comprends pas la moitié de ce que tu écris.
do la fa# si ↓si mi
il y a 4 heures
Ruhkukah
4h
hé bien, t'es une tête dit donc !
même si je comprends pas la moitié de ce que tu écris.
Alors t'es pas en mesure de juger si je suis "un tête" ou non..
il y a 4 heures
Et je vois venir ceux qui critiquent N ciphertexts -> 1 ciphertext par destinataire c'est pour la forward secrecy. (oui, c'est pas ultra optimal O(n) )
Chaque message est chiffrée avec le clef privée éphémère ECDH et la clef publique de chaque destinataire.
Chaque message est chiffrée avec le clef privée éphémère ECDH et la clef publique de chaque destinataire.
il y a 4 heures
Alors t'es pas en mesure de juger si je suis "un tête" ou non..
bin non...
jte up avec un pti compliment et tu m'envoies péter.
pas sympathonche
jte up avec un pti compliment et tu m'envoies péter.
pas sympathonche
do la fa# si ↓si mi
il y a 4 heures
bin non...
jte up avec un pti compliment et tu m'envoies péter.
pas sympathonche
jte up avec un pti compliment et tu m'envoies péter.
pas sympathonche
Pardon, je voulais pas
Les compliments me mettent mal à l'aise
Les compliments me mettent mal à l'aise
il y a 4 heures
En ligne
99
Sur ce sujet0





